xargs
xargs 可以将标准输入数据或文本内容转换成命令行参数。 能处理stdin并将其转换成特定命令的命令行参数,可以将单行或多行文本输入转换成其他格式。
xargs命令应该紧跟在管道操作符之后。它以标准输入作为主要的源数据流,并使用stdin和通过提供命令行参数来执行其他命令
command | xargs
将多行输入转换成单行输出
将换行符(’’\n)转换成空格“ ”
cat 1.txt
1 2 3
4 5 6
7 8 9
cat 1.txt | xargs
1 2 3 4 5 6 7 8 9
将单行输入转换成多行输出
cat 1.txt
1 2 3 4 5 6 7 8 9
cat 1.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
自定义输入界定符
cat 1.txt
argv1kargv2kargv3
cat 1.txt | xargs -d k
argv1 argv2 argv3
cat 1.txt | xargs -d k -n 1
argv1
argv2
argv3
读取文本提供参数
cat 1.txt | xargs -d k -n 1 ./cecho.sh
argv1 #
argv2 #
argv3 #
cat 1.txt | xargs -d k -n 3 ./cecho.sh
argv1 argv2 argv3 #
替换指定参数
./cecho.sh -p arg1 -1
-p arg1 -1 #
cat 1.txt | xargs -d k -n 3 -I {} ./cecho.sh -p {} -1
-p argv1 -1 #
-p argv2 -1 #
-p argv3 -1 #
cat 1.txt | xargs -d k -n 1 -I {} ./cecho.sh -p {} -1
-p argv1 -1 #
-p argv2 -1 #
-p argv3 -1 # # 加了-I 1和3 是一样的效果 每次只替换一个参数
结合find
ls
1.txt f 'f test.txt' test
find . -type f -name "*.txt" -print | xargs
./1.txt ./f test.txt
find . -type f -name "*.txt" -print | xargs rm -f
ls
'f test.txt' test
当文件命中有空格时 可能会导致误操作 xargs 可能分不清定界符时’\n‘还是’\0‘
导致将文件’f test.txt’ 识别为 f和test.txt
指定定界符解决问题
ls
1.txt f 'f test.txt' test
find . -type f -name "*.txt" -print0 | xargs -0 rm -f
ls
f test
结合stdin 巧妙运用while语句和子shell
ls
1.txt aegv1 argv1 argv2 argv3 f test
cat 1.txt | ( while read arg; do cat $arg; done )
cat: argv1: 是一个目录
cat: argv2: 是一个目录
cat: argv3: 是一个目录
cat 1.txt | xargs -n 1 -I {} cat {}
cat: 'argv1 argv2 argv3': 没有那个文件或目录