0

(私はBash環境にいます。WindowsマシンのCygwinで、awk、sed、grep、perlなどを使用しています...)最後のアンダースコア(_)が続く直前に、最後のフォルダー名をファイル名に追加したいファイル名に数字が含まれていない場合は、数字で、または最後に。

これが私が持っているものの例です(何百ものファイルを再編成する必要がありました):

./aaa/A/C_17x17.p
./aaa/A/C_32x32.p
./aaa/A/C.p
./aaa/B/C_12x12.p
./aaa/B/C_4x4.p
./aaa/B/C_A_3x3.p
./aaa/B/C_X_91x91.p
./aaa/G/C_6x6.p
./aaa/G/C_7x7.p
./aaa/G/C_A_113x113.p
./aaa/G/C_A_8x8.p
./aaa/G/C_B.p
./aab/...

次のようにすべてのファイルの名前を変更したいと思います。

./aaa/C_A_17x17.p
./aaa/C_A_32x32.p
./aaa/C_A.p
./aaa/C_B_12x12.p
./aaa/C_B_4x4.p
./aaa/C_A_B_3x3.p
./aaa/C_X_B_91x91.p
./aaa/C_G_6x6.p
./aaa/C_G_7x7.p
./aaa/C_A_G_113x113.p
./aaa/C_A_G_8x8.p
./aaa/C_B_G.p
./aab/...

sed を使用して多くの bash for ループを試しましたが、最後の 1 つは次のとおりです。

IFS=$'\n'
for ofic in `find * -type d -name 'A'`; do
  fic=`echo $ofic|sed -e 's/\/A$//'`
  for ftr in `ls -b $ofic | grep -E '.png$'`; do
    nfi=`echo $ftr|sed -e 's/(_\d+[x]\d+)?/_A\1/'`
    echo mv \"$ofic/$ftr\" \"$fic/$nfi\"
  done
done

しかし、まだ成功\1していません...これは挿入されません$nfi...これは私が最後に試したもので、1つのフォルダー(巨大なフォルダーコレクションのサブフォルダー)でのみ作業し、60分以上失敗した試行の後です、 私はあなたたちと一緒にここにいます。

4

2 に答える 2

1
# it's easier to change to here first
cd aaa
# process every file
for f in $(find . -type f); do
  # strips everything after the first / so this is our foldername
  foldername=${f/\/*/}
  # creates the new filename from substrings of the
  # original filename concatenated to the foldername 
  newfilename=".${f:1:3}${foldername}_${f:4}"
  # if you are satisfied with the output, just leave out the `echo`
  # from below
  echo mv ${f} ${newfilename}
done

あなたのために働くかもしれません。

こちらをご覧ください。(ideone.com の扱いが異なるため、わずかに変更されていますSTDIN/find...)

于 2013-09-30T19:02:24.303 に答える
1

すべての例で機能するようにスクリプトを変更しました。

IFS=$'\n'
for ofic in ???/?; do
  IFS=/ read fic fia <<<$ofic
  for ftr in `ls -b $ofic | grep -E '\.p.*$'`; do
    nfi=`echo $ftr|sed -e "s/_[0-9]*x[0-9]*/_$fia&/;t;s/\./_$fia./"`
    echo mv \"$ofic/$ftr\" \"$fic/$nfi\"
  done
done
于 2014-09-17T11:42:32.237 に答える