TXTファイルにリストされているすべてのファイルをある場所から別の場所にコピーする必要があります。
/1132526906_tt_nad87_1.jpg /thumb/t1132526906_tt_nad87_1.jpg
/1132526906_tt_nad87_10.jpg /thumb/t1132526906_tt_nad87_10.jpg
/1132526906_tt_nad87_11.jpg /thumb/t1132526906_tt_nad87_11.jpg
/1132526907_tt_nad87_12.jpg /thumb/t1132526907_tt_nad87_12.jpg
/1132526907_tt_nad87_13.jpg /thumb/t1132526907_tt_nad87_13.jpg
/1132526908_tt_nad87_14.jpg /thumb/t1132526908_tt_nad87_14.jpg
CSVファイルを生成し、使用可能な文字の一部を使用してsource
分割できます。target
はい
私の考えではコピー1132526906_tt_nad87_1.jpg
からまでの./
ファイル -/thumb/t1132526906_tt_nad87_1.jpg
名前が変更されて移動されました。
質問
これを実行できるコマンドラインコマンドはありますか?例を見つけましたが、これらはコピーのみ可能です(名前を変更することはできません)。
修正する
私はこのスクリプトを作成しました:
#!/bin/bash
input="/data/web/web/gallery/data.csv"
while IFS=',' read from to
do
echo "from: $from, to: $to"
done < "$input"
data.csv
しかし、どの行も「反響」されず、ファイルを読み取っていないようです。何が問題なの?
答え1
OPの例では、名前の変更と変更はかなり一貫しているようです。たとえば、filename.jpg
常に「t」プレフィックスが付いた同じパスのようですthumb/tfilename.jpg
。もしそうなら、もっと簡単な方法があります。
すべて "thumb/" ディレクトリに転送された場合。
現在、ディレクトリにはテストファイルabc.jpgとxyz.jpgがあります。
サンプルファイルのリストは次のとおりです。
$ cat testfile
abc.jpg
xyz.jpg
テスト
echoを使用してコマンドのテストバージョンを実行して、コードが何をすべきかを判断するのに役立ちます。
$ while read my_file; do
echo cp -a "$my_file" "thumb/t$my_file"
done < testfile
テスト結果:
cp -a abc.jpg thumb/tabc.jpg
cp -a xyz.jpg thumb/txyz.jpg
while read my_file; do ... done
構文はstdinを1行ずつ処理します。< testfile
whileステートメントが標準入力を読み取ることができるように、標準入力にリダイレクトするために<
使用されます。testfile
my_file
コードの本文に示すように、入力を保持するために作成した変数です。$my_file
cp
ファイル名にコマンドが引数を識別するために使用するスペースを破る可能性があるスペースやその他の奇妙な文字が含まれている場合は、潜在的な問題を回避するために引用符を使用してください。
決定的な
テストエコーの結果に満足したら、エコーを削除して実際にコマンドを実行できます。
$ while read my_file; do
cp -a "$my_file" "thumb/t$my_file"
done < testfile
ディレクトリを調べると、thumb/
そこにコピーされた2つのテストファイルが表示されます。
フィードバックを含む最終結果
デフォルトでは、cp
エラーがない限りフィードバックは提供されません。したがって、何百または数千のファイルをコピーすると、何も起こらないように見えることがあります。フィードバックを表示するには、詳細オプションを使用してください-v
。
$ while read my_file; do
cp -av "$my_file" "thumb/t$my_file"
done < testfile
結果:
`abc.jpg' -> `thumb/tabc.jpg'
`xyz.jpg' -> `thumb/txyz.jpg'
答え2
最も簡単なのは次のとおりですxargs
。
< file-list.txt xargs -n2 cp -v