1

操作系统:aix 外壳:bsh

你好,pp

我有两种类型的文件,一种以.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文件名时,我收到警告,没有此类文件或目录。

还有另一种获取.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!

4

5 回答 5

3

您可以尝试以下方法:

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

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

find ${INPUT}/ -name "*.pdf" -exec test -e '{}'.marker \; -exec mv '{}' '{}'.marker ${OUTPUT} \;
于 2012-07-11T09:20:37.830 回答
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} \;
于 2012-07-11T10:09:18.747 回答
1

无需使用 xargs:

for i in `find ${INPUT_LOCATION} -name \*.pdf`; do mv $i ${OUTPUT_LOCATION}; mv $i.marker ${OUTPUT_LOCATION}; done
于 2012-07-11T09:16:50.740 回答
0
for f in *.pdf.marker; do
  if [ -e "${f%.marker}" ]; then
    mv "$f" "${f%.marker}" "$OUTPUT_LOCATION"
  fi
done
于 2012-07-11T11:05:32.067 回答
0

如果您安装了 GNU Parallel:

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

要了解更多信息,请观看介绍视频: http: //pi.dk/1

于 2012-07-13T01:27:21.617 回答