Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using xargs with Special characters

Tags:

linux

bash

xargs

I have the following problem. Got a file which includes certain paths/files of a FS. These for some reason do include the whole range of special characters, like space, single/double quotes, even sometimes the Copyright ASCII.

I need to run each line of the file and pass it to another command.

What I tried so far is:

<input_file xargs -I % command %

Which was working until I got this message from xargs

xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option

But usinf this option did not work at all for me

xargs: argument line too long

Does anybody have a solution which does work ok with special characters. Doesn't have to be with xargs, but I need to pass the line as it is to the command.

Many thanks in advance.

like image 959
derchris Avatar asked Aug 21 '14 12:08

derchris


People also ask

What can I use instead of xargs?

If you can't use xargs because of whitespace issues, use -exec . Loops are just as inefficient as the -exec parameter since they execute once for each and every file, but have the whitespace issues that xargs have.

Can we use xargs and standard input?

xargs is a Unix command which can be used to build and execute commands from standard input.

How do I CP with xargs?

We can use xargs to allow us to copy files to multiple locations with a single command. We are going to pipe the names of two directories into xargs as the input parameters. We'll tell xargs to only pass one of these parameters at a time to the command it is working with. In this case, the command is cp .

How is xargs used?

The xargs command builds and executes commands provided through the standard input. It takes the input and converts it into a command argument for another command. This feature is particularly useful in file management, where xargs is used in combination with rm , cp , mkdir , and other similar commands.


1 Answers

You should separate the filenames with the \0 NULL character for processing.

This can be done with

find . <args> -print0 | xargs -0

or if you must process the file with filenames, change the '\n` to '\0', e.g.

tr '\n' '\0' < filename | xargs -0 -n1 -I% echo "==%=="

the -n 1 says,

-n max-args Use at most max-args arguments per command line.

and you should to use "%" quotes to enclosing %

like image 161
jm666 Avatar answered Oct 02 '22 21:10

jm666