polecenie bash dla każdego pliku w folderze

31

Mam zestaw plików, w których chciałbym zastosować to samo polecenie, a dane wyjściowe powinny zawierać tę samą nazwę co przetwarzany plik, ale z innym rozszerzeniem.

Obecnie zmieniam nazwę /my/data/Andrew.doc na /my/data/Andrew.txt Chciałbym to zrobić dla wszystkich plików .doc z folderu / my / data / i zachować nazwę.

Próbowałem kilku wersji, ale wydaje mi się, że mam coś złego w składni, ponieważ jestem nowy w systemie Linux.

Robert
źródło
→ nieco bardziej kompletny i praktyczny przykład: stackoverflow.com/a/43474757/444255
Frank Nocke

Odpowiedzi:

76

Istnieje co najmniej sto tysięcy milionów różnych sposobów podejścia do tego, ale oto najlepsi pretendenci:

Bash for loop

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

Za pomocą find

findKomenda ma piękny mały execpolecenie, które doskonale nadaje się do prowadzenia sprawy (z pewnymi zastrzeżeniami). Znajdź jest lepsze niż podstawowe globowanie, ponieważ naprawdę możesz odfiltrować wybrane pliki. Uważaj na nieparzystą składnię.

find . -iname '*.doc' -exec echo "File is {}" \;

Zauważ, że findjest rekurencyjny, więc możesz chcieć użyć go -maxdepth 1do przechowywania findw bieżącym katalogu roboczym. -type fmoże być użyty do odfiltrowania zwykłych plików.

Jeśli zmieniamy nazwę dokumentu na txt ...

renamePolecenia sed-jak w poszukiwania. Oczywiście to nie zrobi nic, aby przekonwertować format.

rename 's/doc$/txt/' *.doc
Oli
źródło
22
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
DIRAVI
źródło