1

OS:aixシェル:bsh

こんにちは、ppl

2種類のファイルがあります。1つは.pdf.markerで終わり、もう1つは.pdfで終わります。

常に同じ名前のペアが存在する必要があります(拡張子のみが異なります)。

.pdf.markerファイルを移動するときは、対応する.pdfファイルも移動する必要があります。

私はこのようなことを試みました:

find ${INPUT_LOCATION}/ -name "*.pdf.marker" | xargs -I file mv file ${OUTPUT_LOCATION}/. mv $(basename file .marker) ${OUTPUT_LOCATION}/. 

それから私はこれを読みました:引数として複数のコマンドを持つxargsそして次の ようなことを試みました:

find ${INPUT_LOCATION}/ -name "*.pdf.marker" | xargs -I file {mv file ${OUTPUT_LOCATION}/.; mv $(basename file .marker) ${OUTPUT_LOCATION}/.;} 

しかし、それでも機能しませんでした。

xargsの後に2つのコマンドを実行する必要があります。

編集

提案された回答に従って、xargsに続く2つの別々のmoveコマンドではなく、2つのパラメーターを1つのmoveコマンドに入れようとしました。

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で200000ファイルを移動しました。25分 問題なく。

回答を寄せてくださった皆様、ありがとうございました。ナウエル・フイユルさん、ありがとうございました!

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

GNU Parallelがインストールされている場合:

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

詳細については、紹介ビデオをご覧ください:http: //pi.dk/1

于 2012-07-13T01:27:21.617 に答える
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 に答える