Nie jest bezpiecznie parsować ls
ani potokować find
[ 1 , 2 ]
Nie jest bezpiecznie parsować (i przesyłać strumieniowo) danych wyjściowych ls
lub 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 find
polecenie, 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 ./*.png
uzyskać tylko te nie ukryte. Ze find *.png -exec ...
można mieć problem w przypadku był obecny plik o nazwie .png
ponieważ znalezisko dostanie go jako opcja. Możesz dodać, -maxdepth 0
aby uniknąć schodzenia w katalogach o nazwie as Dir_01.png
lub 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 man
peł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 *png
wyś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 ls
lub find
nastę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 printf
lub echo
bę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.png
na końcu, nie ma powodu, dlaczego nie mogę mieć plik png nazwiefoo.zip
lubmy.picture.20160518
czy po prostumypic
.