使用xargs命令和后面的两个移动命令

时间:2012-07-11 09:09:50

标签: bash xargs

操作系统:aix shell:bsh

嗨,ppl

我有两种类型的文件,一种以 .pdf.marker 结尾,另一种以 .pdf

结尾

应始终存在一对具有相同名称的对(仅扩展名不同)。

当我移动 .pdf.marker 文件时,我还必须移动相应的 .pdf 文件。

我试过这样的事情:

find ${INPUT_LOCATION}/ -name "*.pdf.marker" | xargs -I file mv file ${OUTPUT_LOCATION}/. mv $(basename file .marker) ${OUTPUT_LOCATION}/. 

然后我读到了这个:xargs with multiple commands as argument 并尝试过这样的事情:

find ${INPUT_LOCATION}/ -name "*.pdf.marker" | xargs -I file {mv file ${OUTPUT_LOCATION}/.; mv $(basename file .marker) ${OUTPUT_LOCATION}/.;} 

但它仍然没有用。

我只需要在xargs之后执行2个命令。

修改

按照建议的答案,我试图将2个参数放入一个移动命令中 而不是xargs之后的两个单独的移动命令。

find ${INPUT_LOCATION}/ -name "*.pdf.marker" | xargs -I file mv file $(basename file .marker) ${OUTPUT_LOCATION}/. 

但是现在首先移动 .pdf.marker ,然后当我尝试从文件名中删除 .marker 以获取 .pdf < / strong> filename我收到一个警告没有这样的文件或目录。

是否有其他方法可以获取 .pdf 文件名字符串?

find ${INPUT_LOCATION} -name '*.pdf.marker' -exec sh -c 'mv $0 `dirname $0`/`basename $0 .marker` $1' {} ${OUTPUT_LOCATION} \;

在cca中移动了200 000个文件。 25分钟没有问题。

感谢所有参与他们答案的人和非常感谢给你Nahuel Fouilleul!

5 个答案:

答案 0 :(得分:3)

您可以尝试以下内容:

find ${INPUT}/ -name "*.pdf" -exec mv '{}' '{}'.marker ${OUTPUT} \;

要测试标记文件是否存在,您可以使用以下内容:

find ${INPUT}/ -name "*.pdf" -exec test -e '{}'.marker \; -exec mv '{}' '{}'.marker ${OUTPUT} \;

答案 1 :(得分:2)

试试这个(x选项进行调试)

find "${INPUT_LOCATION}" -name '*.pdf.marker' | xargs -i bash -cx 'pdf=`dirname {}`/`basename {} .marker`;[ -e "$pdf" ]&&{ mv {} "$pdf" "$0";}' "${OUTPUT_LOCATION}"

或更短

find $INPUT_LOCATION -name '*.pdf.marker' | xargs -i bash -c 'mv ${0%.marker} $0 $1' {} $OUTPUT_LOCATION

find $INPUT_LOCATION -name '*.pdf.marker' -exec bash -c 'mv ${0%.marker} $0 $1' {} $OUTPUT_LOCATION \;

可能更标准

find ${INPUT_LOCATION} -name '*.pdf.marker' -exec sh -c 'mv $0 `dirname $0`/`basename $0 .marker` $1' {} ${OUTPUT_LOCATION} \;

并且可以添加测试回声

find ${INPUT_LOCATION} -name '*.pdf.marker' -exec sh -c 'echo mv $0 `dirname $0`/`basename $0 .marker` $1' {} ${OUTPUT_LOCATION} \;

答案 2 :(得分:1)

无需使用xargs:

for i in `find ${INPUT_LOCATION} -name \*.pdf`; do mv $i ${OUTPUT_LOCATION}; mv $i.marker ${OUTPUT_LOCATION}; done

答案 3 :(得分:0)

for f in *.pdf.marker; do
  if [ -e "${f%.marker}" ]; then
    mv "$f" "${f%.marker}" "$OUTPUT_LOCATION"
  fi
done

答案 4 :(得分:0)

如果你安装了GNU Parallel:

find ${INPUT_LOCATION} -name '*.pdf.marker' | parallel mv {} {.} ${OUTPUT_LOCATION}

要了解详情,请观看介绍视频:http://pi.dk/1