Chcę przesyłać nazwy plików do innych programów, ale wszystkie dławią się, gdy zawierają spacje.
Powiedzmy, że mam plik o nazwie.
foo bar
Jak mogę uzyskać find
poprawną nazwę?
Oczywiście chcę:
foo\ bar
lub:
"foo bar"
EDYCJA : Nie chcę przechodzić xargs
, chcę uzyskać poprawnie sformatowany ciąg znaków, find
aby móc przesyłać ciąg nazw plików bezpośrednio do innego programu.
find
formatuje nazwy plików; są zapisywane jedna nazwa w wierszu. (Oczywiście jest to niejednoznaczne, jeśli nazwa pliku zawiera znak nowego wiersza.) Problemem jest więc „zadławienie” końca odbierającego, gdy otrzymuje spację, co oznacza, że musisz powiedzieć nam, co to jest koniec odbierający, jeśli chcesz sensowną odpowiedź .
find
zaoferowanie opcji wyświetlania nazw plików w formacie odpowiednim dla powłoki. Zasadniczo jednak rozszerzenie -print0
GNU find
działa również w wielu innych scenariuszach i powinieneś nauczyć się go używać w każdym przypadku.
ls $(command...)
nie przesyła listy stdin
. Umieszcza dane wyjściowe $(command...)
bezpośrednio w wierszu polecenia. W takim przypadku jest to powłoka, która czyta z c, i użyje bieżącej wartości, $IFS
aby zdecydować, jak wyrazić wyjście. Ogólnie lepiej jest używać xargs
. Nie zauważysz uderzenia wydajności.
find -printf '"%p"\n'
doda podwójne cudzysłowy wokół każdej znalezionej nazwy, ale nie będzie poprawnie cytować żadnych podwójnych cudzysłowów w nazwie pliku. Jeśli w nazwach plików nie ma osadzonych podwójnych cudzysłowów, możesz zignorować problem: lub przepuścić sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. Jeśli twoje nazwy plików są obsługiwane przez powłokę, prawdopodobnie powinieneś użyć pojedynczych cudzysłowów zamiast podwójnych cudzysłowów (inaczej sweet$HOME
stanie się czymś podobnym sheet/home/you
). I to wciąż nie jest bardzo odporne na nazwy plików z nowymi liniami. Jak chcesz sobie z tym poradzić?
-exec
flagę zfind
? możesz potencjalnie złagodzić ten błąd i sprawić, że twoje polecenie będzie bardziej wydajne, wykonując je-exec
zamiast potokowania go do innych poleceń. Tylko moje 0,02 $