1

os:aix、shell: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

代わりにシェル グロブを使用してください。例えば:

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 から正解の称賛を盗むつもりはありませんが、何が起こるかを明確にしてください: #num_matching_files 引数で提供されls "$WORKING_DIR"/*.pdf.markerたプロセス イメージを使用して、新しいプロセスのシェル フォークが発生lsします (Windows とは異なり、すべてのコマンドに独自のコマンドを含める必要があります)。グロブ コード (Unix では、コマンドが呼び出される前にシェルによってグロブが展開されます)。

すべてではないにしても、ほとんどのシステムにはコマンドラインの長さ/引数の数に関する制限があり、ここでハードウォールにぶつかるだけです(あなたの場合、 #num_matching_files は20000であるため)

于 2012-07-06T15:06:04.433 に答える
-1

ファイルリストが長すぎると、グロブは失敗します。グロブの代わりに、結果をフィルタリングします。

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 に答える