Невозможно удалить все остальное в папке, кроме 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
то есть сначала достаньте свои важные файлы!