嗨,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!
答案 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