Я хочу видалити всі файли в каталозі, залишаючи лише вказані файли, вони не мають нічого спільного за назвою. Як я міг цього досягти?
Наприклад, імена файлів, які я хочу зберегти, це:
file_1.png
, another_file.jpg
,some_music.mp3
Я хочу видалити всі файли в каталозі, залишаючи лише вказані файли, вони не мають нічого спільного за назвою. Як я міг цього досягти?
Наприклад, імена файлів, які я хочу зберегти, це:
file_1.png
, another_file.jpg
,some_music.mp3
Відповіді:
Якщо ви використовуєте bash:
shopt -s extglob
rm -- !(file1|file2|file3)
Перший рядок просто активує розширене узгодження шаблону, а після цього ми використовуємо один із них:
!(pattern-list)
відповідає будь-якому, крім однієї із заданих шаблонів
а список шаблонів - це список одного або декількох шаблонів, розділених a |
.
Або з zsh
setopt extendedglob
rm -- ^(file1|file2)
Або, більш портативний, використовуючи find
:
find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
Зробіть підкаталог tmp
, перемістіть усі файли, які ви хочете зберегти, до цього каталогу та виконайте rm -f *
згодом. Це не вплине на tmp
каталог.
Після цього просто зробіть:
mv tmp/* .
rmdir tmp
(Якщо припустимо, що жоден із файлів, які ви перемістили, починається з крапки).
Це один з небагатьох випадків, коли є сенс використовувати мишу та браузер файлів, як Nautilus, де ви можете насправді - Ctrlнатиснути кілька файлів, які ви хочете зберегти, а потім скористатися меню: Edit -> Invert Selection
отримати інші файли, а потім видалити ці .
ls
щоб побачити, чи не пропустили жодного з файлів, які хочете зберегти.
Додайте назви файлів, які ви хочете зберегти, у текстовий файл, по одному на рядок. Цей файл не повинен бути в каталозі, або ви також повинні додати його ім'я.
Якщо ім'я вашого каталогу foo, а ім'я файлу - бар , зробіть наступне.
find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm
Це робить наступне:
find -type f
шукає імена всіх файлів у foo та його підкаталогах та друкує їх у STDOUT. З опцією -print0
він розмежовує назви файлів з байтами NUL.grep -v -f bar
виключає всі назви файлів, які відповідають рядку в рядку . З опцією -z
він розглядає свій вхід як набір рядків, розмежованих на байт NUL, а з опцією -Z
він розмежовує свій вихід на байт NUL.xargs rm
rm
кілька разів закликає видалити файли. З опцією -0
він розглядає свої дані як набір рядків, розділених на байт NUL.Це працює з назви файлів, що містять пробіл.
find
я б краще зробивfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
shopt -u extglob
).