Unikaj wyświetlania listy plików z końcówką ~ (pliki kopii zapasowych)

20

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
ciekawy_jeden
źródło
Wygląda na to, że próbujesz uniknąć wyświetlania listy plików, które kończą się na ~. Te pliki to pliki kopii zapasowych utworzone przez niektóre edytory tekstu.
ctrl-alt-delor
Z jakiego systemu operacyjnego korzystasz: czy jest to Gnu / Linux (np. Debian, Ubuntu, Redhat, Centos, Fedora, Suse, Mint, Arch,…)?
ctrl-alt-delor
2
Zauważ, że plik, który chcesz zignorować, wydaje się być kopią zapasową Emacsa. Raczej łatwo jest zmienić zachowanie Emacsa, aby zapisywał kopie zapasowe w scentralizowanym katalogu, a nie wszędzie; patrz emacs.stackexchange.com/questions/33/…
Kilian Foth
Przepraszam, że jestem wredny, ale nie wierzę ci; 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, to ls -1(cyfra jeden) i w wielu systemach -1jest potrzebne do generowania jednokolumnowego wyjścia na terminalu , ale gdy lsjest przesyłane potokowo (jak tutaj grep) lub przekierowane, -1nie jest potrzebne, jest już jednokolumnowe .
dave_thompson_085
@ dave_thompson_085 Obciąłem cały tekst i tylko nazwy plików tutaj .. Ponieważ czułem, że to nie ma znaczenia. Jest to także system produkcyjny (nie mój własny). Nie chcę więc wymieniać nazw użytkowników, szczegółów ani ich ujawniać.
curious_one 10.10.2018

Odpowiedzi:

49
ls -l | grep -v ~

Powodem tego nie jest to, że tylda zostaje rozszerzona do twojego katalogu domowego, więc grepnigdy nie widzi dosłownej tyldy. (Zobacz np . Podręcznik Basha dotyczący rozszerzenia Tilde .) Musisz go zacytować, aby zapobiec rozszerzeniu, tj

ls -l | grep -v "~"

Oczywiście nadal spowoduje to usunięcie wierszy wyjściowych z tyldą w dowolnym miejscu, nawet w środku nazwy pliku lub w innym miejscu lswyniku (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ć

ls -l | grep -v "~$"
ilkkachu
źródło
48

Implementacja GNU ls(dostępna w większości systemów Linux) ma opcję: -BIgnoruj ​​kopie zapasowe:

ls --ignore-backups
hschou
źródło
24

Jeśli używasz bash, upewnij się, że extglobjest włączony:

shopt -s extglob

Następnie możesz użyć:

ls -d -- !(*~)
  • -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 kshglobopcją lub używając własnych rozszerzonych globów:

setopt extended_glob
ls -d -- ^*~

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):

ls -d -- *[^~]

Ale ogólną ideą jest użycie ls --ignore-backups.

Ravexina
źródło
12

To powinno pomóc:

ls -l | grep -v '~'  

Powód: ~ char jest zastępowany przez katalog domowy przed wykonaniem polecenia. Próbować

echo ~

i

echo '~'
Nico Mittenzwey
źródło
6

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, -Cponieważ chcę ładnego wyświetlania w posortowanych kolumnach)

ls -C *[!~]

(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)

Greg A. Woods
źródło
1

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 testplik, 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.

proszę usuń mnie
źródło
1

Chociaż wiele odpowiedzi jest poprawnych (szczególnie podoba mi się ta @Foonjedna), chciałbym zauważyć, że uzyskanie listy nazwisk ls -ljest 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:

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

co dosłownie mówi find:

  1. Poszukaj plików w bieżącym katalogu: .
  2. Szukaj ich tylko na poziomie tego katalogu - nie powtarzaj: -maxdepth 1
  3. Tam poszukaj podmiotów, które

    • typu pliku: -type f
    • i: -a
    • których nazwy nie kończą się na ~: ! -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 )).

  4. Drukuj nazwę każdego znalezionego pliku: -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.

findKomenda 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.

kostix
źródło