Mam folder nadrzędny o nazwie „folder nadrzędny” z dużą liczbą podfolderów, w tych podfolderach znajduje się plik o nazwie „foo.mp4”.
Mogę łatwo znaleźć te pliki, wykonując następujące czynności:
mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;
Teraz zwraca ścieżkę do każdego pliku względem folderu nadrzędnego /
./path/to/foo.mp4
Jak mogę zwrócić samą ścieżkę bez nazwy pliku?
-printf
%h
Wiodące katalogi o nazwie pliku (wszystkie oprócz ostatniego elementu). Jeśli nazwa pliku nie zawiera ukośników (ponieważ znajduje się w bieżącym katalogu), specyfikator% h rozwija się do „.” .find ./ -name "foo.mp4" -printf "%h\n"
wypisze ścieżkę do każdego znalezionego pliku (jeden po wierszu). Co więcej, jak zwykle nikt nie używa,-exec echo {}
dlatego jest-print
(domyślnie nawet pominięty) lubprintf
działanie.-printf
jest tylko GNU. OP wspomina OS / X (system BSD).Odpowiedzi:
Z
GNU
find:W przypadku innych
find
liter podane nazwy katalogów nie zawierają znaków nowej linii:Lub:
oznacza to jednak uruchomienie jednego
dirname
polecenia na plik.Jeśli musisz uruchomić komendę
path
, możesz to zrobić (standardowa składnia):Chociaż w tym przypadku możesz być w stanie użyć
-execdir
(rozszerzenie BSD dostępne również w GNUfind
), którechdir()
znajduje się w katalogu pliku:Uważaj jednak, że podczas gdy implementacja GNU
find
rozszerzy{}
się./filename
tutaj, BSD rozwijają się dofilename
. Tutaj jest OK, ponieważ nazwa pliku jest przekazywana jako argument do opcji i zawszefeatured.mp4
tak jest, ale w innych zastosowaniach może być konieczne wzięcie pod uwagę, że nazwa pliku może zaczynać się od-
lub+
(i być rozumiana jako opcja przez polecenie) lub zawierać=
(i należy to rozumieć na przykład jako przypisanie zmiennej przez awk) lub inne znaki powodujące tego rodzaju problem zperl -p/n
(nie wszystkie z nich naprawione przez prefiks GNUfind
,./
chociaż w tym przypadku) itp., które możesz wziąć pod uwagę .źródło
find .
, będziesz miał nazwę dirname. zamiast całej ścieżki.find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \;
Korzystam z drugiej sugestii, o której wspomniałeś.Poniższe polecenie może również służyć do pobierania tylko szczegółów katalogu.
źródło