web-dev-qa-db-ja.com

サブディレクトリ内のファイルを再帰的に移動します

.
├── 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つのディレクトリを手動で選択することはできません。

3
Ols

最初に頭に浮かぶのは、次の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

関連する質問:

2
pa4080

「17000以上のディレクトリ」について言及したので、findxargsが思い浮かびます。

# 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
2
waltinator