0

次のようなフォルダー構造があります: Photos という名前の大きな親フォルダー。このフォルダには、a_000、a_001、a_002 などの名前の 900 以上のサブフォルダが含まれています。

これらの各サブフォルダーには、dir_001、dir_002 などの名前のサブフォルダーが含まれています。また、これらの各サブフォルダーには、多数の画像 (一意の名前) が含まれています。

a_xxx 内の a_xxx のサブディレクトリに含まれるこれらすべての画像を移動したいと考えています。(xxx は 001、002 など)

同様の質問を調べた後、これが私が思いついた最も近い解決策です。

for file in *; do
  if [ -d $file ]; then
    cd $file; mv * ./; cd ..; 
  fi
done

私が得た別の解決策は、bashスクリプトを実行することです:

#!/bin/bash
dir1="/path/to/photos/"
subs= `ls $dir1`

for i in $subs; do
  mv $dir1/$i/*/* $dir1/$i/ 
done

まだ、何かが足りないのですが、助けてもらえますか?

(その場合、空の dir_yyy を破棄するとよいでしょうが、現時点ではあまり問題にはなりません)

4

3 に答える 3

1

これを試すことができます

#!/bin/bash
dir1="/path/to/photos/"
subs= `ls $dir1`

cp /dev/null /tmp/newscript.sh

for i in $subs; do
  find $dir1/$i -type f -exec echo mv \'\{\}\' $dir1/$i \; >> /tmp/newscript.sh
done

/tmp/newscript.sh次に、エディターで開くかless、やろうとしていることのように見えるかどうかを確認してください。

そうであれば、それを実行しますsh -x /tmp/newscript.sh

于 2016-11-07T16:55:51.400 に答える
1

次のスクリプトで、ファイルが存在するディレクトリが正しい (そして完全である) ことを確認して、試してください。

#!/bin/bash
BigParentDir=Photos

for subdir in "$BigParentDir"/*/; do    # Select the a_001, a_002 subdirs
  for ssdir in "$subdir"/*/; do         # Select dir_001, … sub-subdirs
    for f in "$ssdir"/*; do             # Select the files to move
      if [[ -f $f ]]; do                # if indeed are files
         echo \
         mv "$ssdir"/* "$subdir"/       # Move the files.
      fi
    done
  done      
done

ファイルは移動されず、印刷されるだけです。スクリプトが意図したとおりに動作することが確実な場合は、echo 行をコメントして、「実際に」実行してください。

于 2016-11-07T16:49:13.067 に答える