2017-12-30 35 views
0

ich eine Verzeichnisstruktur wie dieses:Bash-Skript Recursively To Move

|--Photos 
    |--2014-01-15 #2 
     |--IMG_0045.JPG 
     |--IMG_0051.JPG 
    |--2014-06-19 
     |--IMG_0078.JPG 

Hinweis eines Ordners ein Leerzeichen enthält [2014.01.15 # 2]. Ich schrieb einen Bash-Skript, um nur die * .JPG-Dateien in allen Ordnern verschieben diese mit:

#!/bin/bash 
for i in $(ls); do 
    if [ -d $i ]; then 
     cd $i 
     mv *.JPG /opt/data/tmp/ 
     cd - 
    fi 
done 

Ich verstehe, dass das Skript nicht in die Ordner mit Namen ging, die wegen des Wort Splitting Räume enthielten.

Gibt es ein Bash-Skript, das Sie schreiben könnten, um * .JPG-Dateien aus allen Ordnern zu verschieben?

Antwort

1

Einfach mv */*.JPG /opt/data/tmp wird tun, was Sie fragen.

Ihr Skript hat zwei häufige Anfängerfehler. Sie müssen put double quotes around all variables which contain file names, und Sie sollten not be using ls to find files.

Persönlich würde ich auch davon abraten, cd in den meisten Skripten zu verwenden.

Wenn Sie Verzeichnisse in anderen Skripten durchlaufen müssen, for i in ./*/; do ... tut das.

Wenn Sie tief verschachtelte Verzeichnisse beliebig recursen müssen, tut find das. Mit GNU find und GNU mv, find dir -type f -name '*.JPG' -exec mv -t /opt/data/tmp {} +

+0

Oh, und Sie vertippt 'I' nach' – tripleee

+0

for' tripleee Ihre Lösung genau das tat, was ich gesucht habe - danke und auch für die zusätzliche Beratung. Bearbeitet um Tippfehler nach zu korrigieren. –