Nie jest bezpiecznie parsować lsani potokować find[ 1 , 2 ]
Nie jest bezpiecznie parsować (i przesyłać strumieniowo) danych wyjściowych lslub find, głównie dlatego, że w nazwach plików można znaleźć nietypowe znaki jako znak nowej linii , tab ... Tutaj działa czysty cykl powłoki [ cuonglm ] .
Działa nawet findpolecenie, które nie zostało potokowane z opcją -exec:
find ./*.png -exec basename {} .png \;
Aktualizacje / Notatki : Możesz użyć, find .aby wyszukać nawet ukryte pliki lub find ./*.pnguzyskać tylko te nie ukryte. Ze find *.png -exec ...można mieć problem w przypadku był obecny plik o nazwie .pngponieważ znalezisko dostanie go jako opcja. Możesz dodać, -maxdepth 0aby uniknąć schodzenia w katalogach o nazwie as Dir_01.pnglub find ./*.png -prune -exec ...gdy maxdepth nie jest dozwolone (dzięki Stéphane). Jeśli chcesz uniknąć wyświetlania tych katalogów, powinieneś dodać opcję -type f(która wykluczałaby również inne typy nieregularnych plików). Spójrz na manpełniejszą panoramę wszystkich dostępnych opcji i pamiętaj, aby sprawdzić, czy są one zgodne z POSIX, aby uzyskać lepszą przenośność.
Jeszcze kilka słów
Może się zdarzyć na przykład, że po skopiowaniu tytułu z dokumentu i wklejeniu do nazwy pliku jeden lub więcej znaków nowej linii zakończy się w samej nazwie pliku. Możemy mieć tak pecha, że tytuł może zawierać nawet klucz, którego musimy użyć tuż przed nową linią:
The new art of working on .png
files and other formats.
Jeśli chcesz przetestować, możesz utworzyć takie nazwy plików za pomocą poleceń
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
Prosty /bin/ls *pngwyświetli ?zamiast znaków niedrukowalnych
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
We wszystkich przypadkach, w których będzie rura wyjście z lslub findnastępująca komenda będzie miała żadnej wskazówki do zrozumienia, jeżeli obecna linia pochodzi z nowej nazwy pliku lub jeżeli wynika to z nowej linii znak w precedens nazwy pliku . Naprawdę paskudne imię, ale wciąż legalne.
Cykl powłoki z rozszerzeniem parametru powłoki ${parameter%word}, zarówno w wariancie z printflub echobędzie działał [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Ze strony podręcznika rozszerzania parametrów powłoki [ 3 ]
$ {parametr% słowo}
$ {parametr %% słowo}
... wynikiem rozszerzenia jest wartość parametru z usuniętym najkrótszym wzorcem dopasowania (przypadek „%”) lub najdłuższym wzorcem dopasowania (przypadek „%%”).
.. Choć konwencja mówi, aby wymienić swoje pliki.pngna końcu, nie ma powodu, dlaczego nie mogę mieć plik png nazwiefoo.ziplubmy.picture.20160518czy po prostumypic.