Невозможно удалить все остальное в папке, кроме FileA

Как я могу удалить все остальное в папке, кроме FileA, даже скрытые файлы? Я использую Ubuntu.

Я попробовал следующее безуспешно

rm [^fileA]

5 ответов

Решение

Использование extglob, При условии, что FileA обычный файл (т.е. не начинается с .), то вы можете сделать:

shopt -s extglob  # Enable extglob
rm !(FileA) .*  # Remove all regular files not named FileA and all hidden files

Если вместо FileA это скрытый файл, это не будет работать, так как !(шаблон) Конструкция только создает список всех обычных файлов, не соответствующих шаблону.

find . -not -name fileA -exec rm {} \;

Обратите внимание, что при этом будут удалены только файлы, а не папки. Поверьте, вы не хотите удалять такие папки.

Вы также можете сделать это в интерактивном режиме,

rm -i * .*

* Для всех файлов (кроме скрытых файлов)..* Для всех скрытых файлов

gene@vmware:/tmp/test$ ls -al
total 8
drwxr-xr-x  2 gene    gene    4096 2009-03-11 12:51 .
drwxrwxrwt 12 root    root    4096 2009-03-11 12:51 ..
-rw-r--r--  1 gene    gene       0 2009-03-11 12:51 fileA
-rw-r--r--  1 gene    gene       0 2009-03-11 12:51 .fileB
gene@vmware:/tmp/test$ rm -i * .*
rm: remove regular empty file `fileA'? n
rm: cannot remove directory `.'
rm: cannot remove directory `..'
rm: remove regular empty file `.fileB'? y
gene@vmware:/tmp/test$ ls -al
total 8
drwxr-xr-x  2 gene    gene    4096 2009-03-11 12:51 .
drwxrwxrwt 12 root    root    4096 2009-03-11 12:51 ..
-rw-r--r--  1 gene    gene       0 2009-03-11 12:51 fileA

Для нескольких файлов следующее удалит все файлы, кроме тех, которые имеют FileA или FileB в имени.

for file in *
do
  if [ x`echo $file | grep -ve "\(FileA\|FileB\)"` == x ]; then
    rm $file
  fi
done

Это более полезно в длинном списке файлов. Если бы это был только короткий список, я бы пошел с ответом CoverosGene.

Большинство способов сделать это на основе анализа списка каталогов, вероятно, подвержены ошибкам.

Если у вас есть права на запись в родительский каталог, а нужный вам файл находится в подкаталоге foo, как насчет:

% mkdir bar
% mv foo/fileA bar
% rm -rf foo
% mv bar foo

то есть сначала достаньте свои важные файлы!

Другие вопросы по тегам