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ć findpoprawną nazwę?
Oczywiście chcę:
foo\ bar
lub:
"foo bar"
EDYCJA : Nie chcę przechodzić xargs, chcę uzyskać poprawnie sformatowany ciąg znaków, findaby móc przesyłać ciąg nazw plików bezpośrednio do innego programu.
findformatuje 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ź .
findzaoferowanie opcji wyświetlania nazw plików w formacie odpowiednim dla powłoki. Zasadniczo jednak rozszerzenie -print0GNU finddział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, $IFSaby 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$HOMEstanie 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ć?
-execflagę zfind? możesz potencjalnie złagodzić ten błąd i sprawić, że twoje polecenie będzie bardziej wydajne, wykonując je-execzamiast potokowania go do innych poleceń. Tylko moje 0,02 $