.
├── subdirectory-A
│ ├── 1.jpg
│ ├── 1.tif
│ ├── 2.jpg
│ ├── 2.tif
│ ├── JPEG
│ └── TIF
└── subdirectory-B
├── 1.jpg
├── 1.tif
├── 2.jpg
├── 2.tif
├── JPEG
└── TIF
誰か助けてくれますか?ローカルからシェルスクリプトで(mv
)を実行して、すべての.tif
ファイルをTIFディレクトリに移動し、すべての.jpg
ファイルをJPEGディレクトリに移動する方法を見つけようとしています親ディレクトリ。私は使用しています
mv *.jpg JPEG/
各サブディレクトリ内ですが、17Kを超えるディレクトリがあるアーカイブでこのジョブを実行する必要があり、一度に1つのディレクトリを手動で選択することはできません。
最初に頭に浮かぶのは、次のBashループです。
#!/bin/bash
for dir in */ # or use: subdirectory*/
do
cd "$dir"
mv *jpg JPG/
mv *tif TIF/
cd ..
done
インラインコマンドとしての使用例:
$ mkdir -p subdirectory-{A,B}/{TIF,JPG}; touch subdirectory-{A,B}/{1,2}.{jpg,tif}
$ for dir in */; do cd "$dir"; mv *jpg JPG/; mv *tif TIF/; cd ..; done
$ tree
.
├── subdirectory-A
│ ├── JPG
│ │ ├── 1.jpg
│ │ └── 2.jpg
│ └── TIF
│ ├── 1.tif
│ └── 2.tif
└── subdirectory-B
├── JPG
│ ├── 1.jpg
│ └── 2.jpg
└── TIF
├── 1.tif
└── 2.tif
6 directories, 8 files
関連する質問:
「17000以上のディレクトリ」について言及したので、find
とxargs
が思い浮かびます。
# do this part Only Once
cat >./TheScript <<"EOF"
#!/bin/bash
while $# -gt 0 ; do
cd "$1"
find . -maxdepth 1 -type f -name '*.jpg' -print | xargs --no-run-if-empty mv --target-directory=JPG
find . -maxdepth 1 -type f -name '*.tif' -print | xargs --no-run-if-empty mv --target-directory=TIF
cd "$OLDPWD"
shift
done
exit 0
EOF
chmod +x ./TheScript
# end of "Only Once"
find . -type d \! -name 'JPG' -a \! -name 'TIF` -print |\
xargs $PWD/.TheScript