1

操作系统:aix,外壳:bsh

我在一个目录中有大约 20k 个文件,这些文件名为 filename.pdf.marker 和 filename.pdf,我们使用以下代码段复制目录内容

ls ${WORKING_DIR}/*.pdf.marker 2> /dev/null | while read FILEMARKER;
do
    FILENAME=${WORKING_DIR}/$(basename ${FILEMARKER} .marker)
        mv ${FILENAME} ${LOG_DIR}/.  
        mv ${FILENAME}.marker ${LOG_DIR}/.  
    done   

但问题是并非所有文件都被复制,因为ls不会返回工作目录中的完整文件列表,因为文件列表太长了。

您能给我一些建议如何在不删除循环的情况下升级脚本吗?

谢谢

4

5 回答 5

4

请改用 shell glob。例如:

for file in ${WORKING_DIR}/*.pdf.marker; do
    : # do something with "$file"
done
于 2012-07-06T13:21:15.377 回答
1

尝试find代替ls

find ${WORKING_DIR} -name \*.pdf.marker | while read FILENAME; do
  ...
done

为了简单起见,我故意忽略了文件名中可能出现的空格。

于 2012-07-06T13:57:52.760 回答
0

我不想从 CodeGnome 窃取正确答案的荣誉,但要弄清楚会发生什么:ls "$WORKING_DIR"/*.pdf.marker导致 shell 分叉一个新进程,进程映像ls带有 #num_matching_files 参数(不像在 Windows 上,每个命令都必须包含自己的globbing 代码,在 Unix 上,glob在命令被调用之前由shell扩展)。

大多数(如果不是所有)系统都对命令行的长度/参数数量有限制,而您只是在这里碰壁(因为在您的情况下#num_matching_files 是 20000)

于 2012-07-06T15:06:04.433 回答
-1

如果文件列表太长,glob 会失败。过滤结果而不是 glob:

ls ${WORKING_DIR} | grep '\.pdf\.marker$'  | while read FILEMARKER
do
    ...
done

强制性免责声明:如果您的文件名包含特殊字符(例如任何空格),这将失败。

于 2012-07-06T13:23:28.697 回答
-2

尝试关闭ls-f-U,我认为)的排序,或使用其他程序,如find

于 2012-07-06T13:24:25.150 回答