我正在使用bash shell。
嗨,如果有人能提供一些建议的话,ppl会很高兴的,因为谷歌搜索得到了一些答案,但仍然无法让脚本工作。
我刚开始使用bash脚本,并得到了一个要修改的脚本,因为在处理完文件后,它无法将大量文件从和输入目录复制到输出目录。
描述:
我们在一个大目录里有一堆pdf。我们处理一个名为filename.pdf的文件,在处理它之后,创建一个名为filename.pdf.marker的附加文件,然后将filename.pdf.marker和filename.pdf文件从input/in目录移动到目录输出/out。我们处理了大约10-15万个文件。
脚本应该执行以下操作:
G 211
旧脚本(不适用于更大数量的文件):
FILELIST=$(ls ${V04}/*.pdf.marker 2> /dev/null | sort)
for FILEMARKER in ${FILELIST}; do
    FILENAME=${V04}/$(basename $FILEMARKER .marker)
        mv ${FILENAME} ${VLOGDIR}/.  
        mv ${FILENAME}.marker ${VLOGDIR}/.  
    done  因此,我需要使用xargs命令。
问题:
我设法将.marker文件移动到一个单独的行中。现在,我需要用这个脚本行移动.pdf文件。
find /input/in -iname "*.marker" -print0 | xargs -0 -r -I {} mv `basename {} .marker`  /output/out我的问题在于:basename {} .marker为什么没有从字符串filename.pdf.marker,中提取字符串filename.pdf并替换为mv命令?
(欢迎任何帮助;)
更新
发布于 2011-08-22 08:06:57
旧脚本的问题是,您试图捕获一个变量中的所有条目,这些条目都有大小限制。如果不能以这种方式对条目进行排序,则可以解决这个问题:
ls -1 "${V04}/*.pdf,.marker | while read FM; 
do 
    mv "${FM}" "${VLOGDIR}/"
    mv "${V04}/$(basename "${FM}" .marker)" "${VLOGDIR}/"
done;发布于 2011-08-22 07:14:19
编辑:,正如注释中指出的,如果文件名中有空格,这将无法工作。在这种情况下,请参阅@Jonathan的答案(即使现在没有空格,您可能还是应该使用他的版本,以避免突然出现空格时的损坏.)。
由于该命令是在执行之前展开的,所以您不能这样使用它。您将给xargs的命令如下所示:
xargs -0 -r -I {} mv {} /output/out因为它试图从字符串{}中删除任何路径组件和.marker后缀。
我想说,在这种情况下,您想使用一个循环:
for f in $(find /input/in -iname "*.marker"); do
    mv `basename $f .marker` /output/out
done发布于 2011-08-22 14:24:12
使用GNU并行,您应该能够:
ls "$V04"/*.pdf.marker | parallel -q mv {.} {} "$VLOGDIR"即使$V04和$VLOGDIR包含“”空格\t,这也是可行的。
观看介绍视频以了解更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ
https://stackoverflow.com/questions/7144106
复制相似问题