Уникайте переліку файлів, які закінчуються на ~ (резервні файли)


20

Моя вимога - перерахувати всі файли в каталозі, крім файлів, що закінчуються на ~(резервні файли).

Я намагався використовувати команду:

ls -l | grep -v ~    

Я отримую цей вихід:

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~

Я хочу отримати лише ці файли:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt

Схоже, ви намагаєтеся уникати переліку файлів, які закінчуються символом a ~. Цей файл - це резервні файли, створені моїми текстовими редакторами.
ctrl-alt-delor

Яку операційну систему ви використовуєте: це Gnu / Linux (наприклад, Debian, Ubuntu, Redhat, Centos, Fedora, Suse, Mint, Arch,…)?
ctrl-alt-delor

2
Зауважте, що файл, який ви хочете ігнорувати, схоже на файли резервного копіювання Emacs. Досить просто змінити поведінку Emacs так, щоб це економило резервні копії в централізованому каталозі, а не в усьому місці; дивіться emacs.stackexchange.com/questions/33/…
Кіліан Фот

Мені дуже шкода, але я не вірю тобі; ls -l(літер ell) міститиме дозволи, nlinks, власник, розмір та мод час для кожного переліченого файлу. Те, що дало б результат, який ви показуєте, - це ls -1цифра один), і для багатьох систем -1потрібно для отримання одноколонного виводу на терміналі , але коли lsце трубопровід (як тут grep) або перенаправлений, -1він не потрібен, він вже є одноколонним .
dave_thompson_085

@ dave_thompson_085 Я врізав увесь текст, і лише назви файлів тут .. Тому що я вважав, що це не має значення. А також це виробнича система (не моя власна система). Тому я не хочу перелічувати імена користувачів, деталі та просочувати їх.
curious_one

Відповіді:


49
ls -l | grep -v ~

Причина цього не працює в тому, що тильда розширюється до вашого домашнього каталогу, тому grepніколи не бачить буквального тильду. (Дивіться , наприклад , керівництво по Тільда в Bash .) Ви повинні процитувати її , щоб запобігти розширенню, тобто

ls -l | grep -v "~"

Звичайно, це все-таки видалить будь-які вихідні рядки з тильдом де завгодно, навіть посередині імені файлу або в іншому місці lsвиводу (хоча це, ймовірно, не відображатиметься в іменах користувачів, датах тощо). Якщо ви дійсно хочете ігнорувати лише файли, які закінчуються тильдом, можете скористатися

ls -l | grep -v "~$"

48

Реалізація GNU ls(знайдена в більшості систем Linux) має для цього можливість: -BІгнорувати резервні копії:

ls --ignore-backups

24

Якщо ви використовуєте bash, переконайтеся, що extglobввімкнено:

shopt -s extglob

Тоді ви можете використовувати:

ls -d -- !(*~)
  • -d не показувати вміст каталогів
  • !(*~) всі файли, крім тих, що закінчуються ~

На zsh ви можете зробити те ж саме з kshglobопцією або використовуючи власні розширені глобуси:

setopt extended_glob
ls -d -- ^*~

Оскільки суфікс для виключення має лише один символ, ви також можете зіставити назви файлів, де останнім символом є не тильда (це теж має працювати без extglob:)

ls -d -- *[^~]

Але загальною ідеєю є використання ls --ignore-backups.


12

Це має допомогти:

ls -l | grep -v '~'  

Причина: команда ~ char замінюється вашим домашнім каталогом перед виконанням команди. Спробуйте

echo ~

і

echo '~'

6

Як згадувалося в інших відповідях, причина, по якій ви, ймовірно, маєте проблеми, полягає в тому, що ви не цитували і не уникали тильди.

Для одного конкретного випадку використання я використовував розширення імені файлу оболонки, щоб зробити щось подібне. Я використовую його приблизно з 2003 року, а це означає, що він працював над дуже широким спектром реалізацій оболонок у різних системах. (тут я також використовую, -Cтому що я хочу приємно відобразити в відсортованих стовпцях)

ls -C *[!~]

(обмеження у використанні розширення назви файлів оболонки - це, звичайно, те, що каталог з дуже великою кількістю файлів (не резервного копіювання) призведе до того, що розширення перевищить доступний розмір списку аргументів, хоча в більшості сучасних систем цей ліміт досить високий, часто 250 Кб або більше, іноді набагато більше)


1

ls | grep -v '~$'- швидке рішення. Він використовує ls для списку всіх (не прихованих) файлів, потім використовує grep з -v(перевернуте відповідність, тобто виключення), щоб виключити всі рядки з tilde ( ~) в кінці ( $).

ЗНАЙДА, якщо у вас є будь-які файли, названі як щось1, щось2, це ВЕЛИЧИЙ смердючий показник того, що у вас поганий робочий процес, який слід виправити у джерелі, а не з незграбними хаками, такими як модифікація роботи ls.

Якщо ви виявите, що ви називаєте файли з номерами версій, як-от test1 і test2 або testone і testtwo, то вам дуже потрібна така система контролю версій, як git.

Особливо це стосується вашого випадку, коли у вас є кілька версій декількох файлів, і, здається, потрібне узгодження версій між усіма файлами.

Системи керування версіями дозволяють по суті накладати часове вікно на файлову систему, тому ви бачите лише один testфайл, але під кришкою (через програму управління версіями) всі версії доступні для пошуку, пошуку, повернення до, порівняння тощо .

Після цього налаштування вам більше не потрібні файли резервного копіювання у вашому редакторі, оскільки контроль версій має історію файлів з того часу, як ви почали його використовувати, навіть якщо ви внесли тисячу змін з того часу. Ви навіть можете «відгалужувати» хронологію історії, випробовуючи нову ідею і повертаючись у часі, а потім вперед, щоб спробувати іншу ідею, якщо вам потрібно.


1

Хоча багато відповідей правильні (мені це подобається @Foonособливо), я зазначу, що отримання списку імен з ls -lрізних причин трохи кульгає.

Правильним інструментом пошуку файлів, не дивно, є find.

Один з його результатів полягає в тому, що він здатний обробляти "логіку вибору" самостійно, наприклад:

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

що буквально говорить find:

  1. Шукайте файли в поточному каталозі: .
  2. Шукайте їх лише на рівні цього каталогу - тобто не повторюйте: -maxdepth 1
  3. Там шукайте сутності, які

    • файлу типу: -type f
    • і: -a
    • імена яких не закінчуються ~: ! -name *~ (де !заперечується наступна директива, яка відповідає іменам файлів, -name *~).

    (Щоб вся відповідність типу та імені виглядала як логічна одиниця, вона вкруглена в дужках (і )).

  4. Видавати ім'я кожного знайденого файлу: -print.

Вам потрібно захистити деякі символи, які є спеціальними для оболонки, від інтерпретації оболонкою, і тому круглі дужки та вибух, що !протікають з зворотною косою рисою, а шаблон імені *~оточений одинарними лапками.

findКоманди мають дуже потужну міні-мови через використання його можливостей. Наприклад, може бути сказано рекурсивно обробляти ціле дерево файлової системи (або дерева), але опускати певні каталоги під час сканування. Можна співставити декілька атрибутів файлів - наприклад, час створення або модифікації чи розмір будь-якого.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.