Moim wymaganiem jest wylistowanie wszystkich plików w katalogu, z wyjątkiem plików kończących się na ~
(pliki kopii zapasowych).
Próbowałem użyć polecenia:
ls -l | grep -v ~
Otrzymuję ten wynik:
asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~
Chcę uzyskać tylko te pliki:
asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt
~
. Te pliki to pliki kopii zapasowych utworzone przez niektóre edytory tekstu.ls -l
(letter ell) zawierałby uprawnienia, nlinks, właściciela, rozmiar i modtime dla każdego wymienionego pliku. To, co dałoby wynik, który wyświetlasz, tols -1
(cyfra jeden) i w wielu systemach-1
jest potrzebne do generowania jednokolumnowego wyjścia na terminalu , ale gdyls
jest przesyłane potokowo (jak tutajgrep
) lub przekierowane,-1
nie jest potrzebne, jest już jednokolumnowe .Odpowiedzi:
Powodem tego nie jest to, że tylda zostaje rozszerzona do twojego katalogu domowego, więc
grep
nigdy nie widzi dosłownej tyldy. (Zobacz np . Podręcznik Basha dotyczący rozszerzenia Tilde .) Musisz go zacytować, aby zapobiec rozszerzeniu, tjOczywiście nadal spowoduje to usunięcie wierszy wyjściowych z tyldą w dowolnym miejscu, nawet w środku nazwy pliku lub w innym miejscu
ls
wyniku (chociaż prawdopodobnie nie pojawi się w nazwach użytkowników, datach itp.). Jeśli naprawdę chcesz zignorować tylko pliki z tyldą, możesz użyćźródło
Implementacja GNU
ls
(dostępna w większości systemów Linux) ma opcję:-B
Ignoruj kopie zapasowe:źródło
Jeśli używasz bash, upewnij się, że
extglob
jest włączony:Następnie możesz użyć:
-d
nie wyświetlać zawartości katalogów!(*~)
wszystkie pliki oprócz tych, które kończą się na~
Na Zsh możesz zrobić to samo z
kshglob
opcją lub używając własnych rozszerzonych globów:Ponieważ sufiks do wykluczenia ma tylko jeden znak, możesz również dopasować nazwy plików, w których ostatni znak nie jest tyldą (to też powinno działać bez
extglob
):Ale ogólną ideą jest użycie
ls --ignore-backups
.źródło
To powinno pomóc:
Powód: ~ char jest zastępowany przez katalog domowy przed wykonaniem polecenia. Próbować
i
źródło
Jak wspomniano w innych odpowiedziach, prawdopodobnie masz problemy, ponieważ nie zacytowałeś ani nie uciekłeś przed tyldą.
W jednym konkretnym przypadku użycia użyłem rozszerzenia nazwy powłoki, aby zrobić coś podobnego. Używam go od około 2003 roku, co oznacza, że działał on na bardzo szeroką gamę implementacji powłoki na różnych systemach. (tutaj też używam,
-C
ponieważ chcę ładnego wyświetlania w posortowanych kolumnach)(ograniczenie związane z używaniem rozszerzania nazw plików powłoki jest oczywiście takie, że katalog z bardzo dużą liczbą plików (bez kopii zapasowych) spowoduje, że rozszerzenie przekroczy dostępną wielkość listy argumentów, chociaż w większości nowoczesnych systemów ten limit jest dość wysoki, często 250 KB lub więcej, czasem znacznie więcej)
źródło
ls | grep -v '~$'
jest szybkim rozwiązaniem. Używa ls, aby wyświetlić wszystkie (nie ukryte) pliki, a następnie używa grep z-v
(odwróconym dopasowaniem, tj. Wykluczeniem), aby wykluczyć wszystkie linie ze znakiem tyldy (~
) na końcu ($
).JEDNAK, jeśli masz JAKIEKOLWIEK pliki o nazwie jak coś1, coś2, jest to OGROMNY śmierdzący wskaźnik, że masz zły przepływ pracy, który powinieneś naprawić u źródła, a nie przy niezręcznych włamaniach, takich jak modyfikowanie działania ls.
Jeśli nazywasz się plikami o numerach wersji, takich jak test1 i test2 lub testone i testtwo, naprawdę potrzebujesz systemu kontroli wersji
git
.Jest to szczególnie prawdziwe w twoim przypadku, gdy masz wiele wersji wielu plików, a wersjonowanie wydaje się wymagać koordynacji między wszystkimi plikami.
Systemy kontroli wersji pozwalają zasadniczo nałożyć okno czasowe na system plików, więc widzisz tylko jeden
test
plik, ale pod maską (za pośrednictwem programu kontroli wersji) wszystkie wersje są dostępne do wyszukiwania, pobierania, przywracania, porównywania itp. .Po skonfigurowaniu nie potrzebujesz już plików kopii zapasowych z edytora, ponieważ kontrola wersji ma historię plików od momentu ich użycia, nawet jeśli od tego czasu wprowadziłeś tysiące zmian. Możesz nawet „rozgałęzić” oś czasu historii, wypróbować nowy pomysł i cofnąć się w czasie, a następnie naprzód, aby wypróbować inny pomysł, jeśli zajdzie taka potrzeba.
źródło
Chociaż wiele odpowiedzi jest poprawnych (szczególnie podoba mi się ta
@Foon
jedna), chciałbym zauważyć, że uzyskanie listy nazwiskls -l
jest nieco kiepskie z różnych powodów.Nie jest zaskoczeniem, że właściwym narzędziem do wyszukiwania plików
find
.Jednym z jej rezultatów jest to, że jest w stanie samodzielnie poradzić sobie z „logiką wyboru”, na przykład:
co dosłownie mówi
find
:.
-maxdepth 1
Tam poszukaj podmiotów, które
-type f
-a
~
:! -name *~
(gdzie!
neguje następującą dyrektywę, która pasuje do nazw plików,-name *~
).(Aby całe dopasowanie typu i nazwy pojawiło się jako jednostka logiczna, jest umieszczone w nawiasach za pomocą
(
i)
).-print
.Musisz chronić niektóre znaki specjalne dla powłoki przed interpretacją przez powłokę, dlatego nawiasy i huk
!
są odwrócone, a wzorzec nazwy*~
jest otoczony pojedynczymi cudzysłowami.find
Komenda posiada bardzo mocny mini-język poprzez wykorzystanie jego możliwości. Na przykład może być polecone rekurencyjne przetwarzanie całego drzewa systemu plików (lub drzew), ale podczas skanowania pomijane są niektóre katalogi. Możliwe jest dopasowanie kilku atrybutów plików - takich jak czas utworzenia lub modyfikacji lub rozmiar dowolnego pliku.źródło