jeśli find ext, to cp rodzic dir else echo nie zostało znalezione

2

Do tej pory wymyśliłem to.

if ls -1 ~/Downloads/*.mkv >/dev/null 2>&1
then
        echo 1
else
        echo 0
fi

Chciałbym jednak skopiować katalog macierzysty znalezionego pliku do innej lokalizacji.

Mam wrażenie, że powinienem po prostu użyć polecenia find.

David Custer
źródło
Czy możesz opisać, co naprawdę musisz osiągnąć? Jeśli folder zawiera folder, .mkvktóry chcesz skopiować w inne miejsce?
slhck,
@slhck Tak, właśnie to chciałbym zrobić.
David Custer,

Odpowiedzi:

1

Odpowiedź fede.evol kończy się niepowodzeniem, jeśli ścieżki zawierają spacje. Dane wyjściowe findlub ls nie powinny być używane w podstawianiu poleceń .

Właściwy sposób postępowania ze wszystkimi nazwami plików (z wyjątkiem ścieżek z nowymi liniami) to:

find /somewhere -name "*.mkv" -exec dirname {} \; | uniq | \
while IFS= read -r dir; do echo cp -- "$dir" /other/; done

W ten sposób każdy folder z /somewherejest kopiowany do /other/. Pamiętaj, że ukośnik końcowy jest obowiązkowy, ponieważ w przeciwnym razie cel zawsze zostanie nadpisany.

slhck
źródło
1

Służy dirname FILEdo uzyskania nazwy katalogu danego pliku. Na przykład:

find DIRECTORY -name "*.mkv" -exec dirname {} \;

Da ci wszystkie katalogi z MKV pod DIRECTORY. Następnie możesz przekazać je, uniqaby nie dostać podwójnych, a następnie w przypadku kopiowania.

Na przykład

cp -a `find DIRECTORY -name "*.mkv" -exec dirname {} \; | uniq` DESTDIR
fede.evol
źródło
Twoje ostatnie polecenie zakończy się niepowodzeniem, jeśli ścieżka do katalogu zawiera spacje. Nie należy używać podstawiania poleceń na findlub lswyjściowych.
slhck,