0

何千もの画像を含むフォルダーがあります。これらのイメージはペアで提供され、一方には のような名前が付けapple_0_2_3_suffix1.pngられ、もう一方には のような名前が付けられapple_0_2_3_suffix2.pngます。これらのペアの 70% をランダムに選択して別のフォルダーに移動する Bash スクリプトを書きたいと思います。

これどうやってするの?

4

2 に答える 2

2

これどうやってするの?

1つのアイデアがあります:

  1. すべてを一覧表示apple*suffix1.png
  2. 上記の出力をファイルに保存します。suffix1.list
  3. suffix1.listこれで、70% がファイル (またはその中の行) の数、たとえばn行数であることがわかります。
  4. shuf ファイルの最初のn行だけを取得します。(shuf コマンドを使用できます)
  5. ここで、awk、sed を使用してmvコマンドを生成するか、a を使用しfor loopてファイルを dest dir に移動できます。重要なのは、1 つの「mv」コマンドを出力するか、1 つのファイルを移動するときは、対応するファイルを別の接尾辞で印刷/移動する必要があることです2。

ノート

suffix1.listスクリプトを 1 つ記述すれば、ファイルの保存を避けることができます。ファイルを使用すると、プロセスが簡単になる可能性があるためです。また、私の考えを説明する方が簡単です。

「アイデアが役に立たない場合はお知らせください。実行中のコードが欲しいだけです。

編集操作はコードを必要とします:

suf11)ファイル リストをシミュレートします。

kent$  seq -f "apple_%03g_suf1.png" 20 > suf1.txt  

ファイルを取得するには、find/ls などを実行する必要があります。私のファイルは次のようになります。

kent$  cat suf1.txt
apple_001_suf1.png
apple_002_suf1.png
apple_003_suf1.png
apple_004_suf1.png
apple_005_suf1.png
...
apple_020_suf1.png

2) shuf、70% を計算し、mv コマンドを生成します。

kent$  shuf suf1.txt|awk '{a[NR]=$0}END{l=NR*0.7;s="mv \"%s\" /path/dest\n"; for(x=1;x<=l;x++){printf s,a[x];sub("suf1","suf2",a[x]);printf s, a[x]}}'                      
mv "apple_008_suf1.png" /path/dest
mv "apple_008_suf2.png" /path/dest
mv "apple_011_suf1.png" /path/dest
mv "apple_011_suf2.png" /path/dest
mv "apple_009_suf1.png" /path/dest
mv "apple_009_suf2.png" /path/dest
mv "apple_015_suf1.png" /path/dest
mv "apple_015_suf2.png" /path/dest
mv "apple_003_suf1.png" /path/dest
mv "apple_003_suf2.png" /path/dest
mv "apple_013_suf1.png" /path/dest
mv "apple_013_suf2.png" /path/dest
mv "apple_017_suf1.png" /path/dest
mv "apple_017_suf2.png" /path/dest
mv "apple_019_suf1.png" /path/dest
mv "apple_019_suf2.png" /path/dest
mv "apple_006_suf1.png" /path/dest
mv "apple_006_suf2.png" /path/dest
mv "apple_016_suf1.png" /path/dest
mv "apple_016_suf2.png" /path/dest
mv "apple_010_suf1.png" /path/dest
mv "apple_010_suf2.png" /path/dest
mv "apple_004_suf1.png" /path/dest
mv "apple_004_suf2.png" /path/dest
mv "apple_018_suf1.png" /path/dest
mv "apple_018_suf2.png" /path/dest
mv "apple_005_suf1.png" /path/dest
mv "apple_005_suf2.png" /path/dest

ご覧のとおり、20 の 70% は 14 であるため、28 の mv コマンドが生成されます。そして、必要に応じてランダムに。

それらを印刷する必要はありません。ここでコマンドを示したいだけです。あなたはただ行うことができます:

shuf suf1.txt|awk '..my awk codes here..'|sh

操作を行いmvます。もちろん、これ/path/destは単なる例です。

幸運を。

于 2013-04-28T16:37:20.937 に答える