Как я могу удалить только зарегистрированные файлы в каталоге без каких-либо подсказок?

Я хочу удалить только записываемые файлы в каталоге. Если я сделаю

rm * 

он удаляет все файлы, доступные для записи (пока это так хорошо), но я получаю приглашение для каждого файла, который не записывается. Мне не нужна подсказка, я просто хочу оставить незаписанные файлы в покое.

Ответ не «rm -f», потому что это приведет к удалению незаписываемых файлов.

Итак, есть ли простая команда для удаления только файлов, доступных для записи, без каких-либо подсказок?

3 Solutions collect form web for “Как я могу удалить только зарегистрированные файлы в каталоге без каких-либо подсказок?”

Я не думаю, что rm сделает это сам по себе, в опциях нет очевидного флага.

Вы можете использовать смесь find и rm для ее достижения.

find -maxdepth 1 -type f -writable -exec rm {} +

Например,

 tony@trinity:~/temp$ ls -l total 0 tony@trinity:~/temp$ touch bob tony@trinity:~/temp$ touch bill tony@trinity:~/temp$ touch fred tony@trinity:~/temp$ chmod 400 fred tony@trinity:~/temp$ ls -l total 0 -rw-r--r-- 1 tony tony 0 Mar 10 20:19 bill -rw-r--r-- 1 tony tony 0 Mar 10 20:19 bob -r-------- 1 tony tony 0 Mar 10 20:19 fred tony@trinity:~/temp$ mkdir test tony@trinity:~/temp$ cd test tony@trinity:~/temp/test$ touch chris tony@trinity:~/temp/test$ cd .. tony@trinity:~/temp$ ls -lR .: total 4 -rw-r--r-- 1 tony tony 0 Mar 10 20:19 bill -rw-r--r-- 1 tony tony 0 Mar 10 20:19 bob -r-------- 1 tony tony 0 Mar 10 20:19 fred drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test ./test: total 0 -rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris tony@trinity:~/temp$ find -maxdepth 1 -type f -writable -exec rm {} + tony@trinity:~/temp$ ls -lR .: total 4 -r-------- 1 tony tony 0 Mar 10 20:19 fred drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test ./test: total 0 -rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris 

Это не будет вести себя так же, как rm -r поэтому вам нужно будет переосмыслить его, если вы хотите спуститься в подкаталоги, и, как написано, он вообще не удалит каталоги.

Как предлагает @Giles , вы также можете использовать действие -delete для выполнения всей работы внутри find , например,

 $ ls -lR .: total 4 -rw-r--r-- 1 tony tony 0 Mar 10 23:16 bill -rw-r--r-- 1 tony tony 0 Mar 10 23:16 bob -r-------- 1 tony tony 0 Mar 10 20:19 fred drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test ./test: total 0 -rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris tony@trinity:~/temp$ find -maxdepth 1 -type f -writable -delete tony@trinity:~/temp$ ls -lR .: total 4 -r-------- 1 tony tony 0 Mar 10 20:19 fred drwxr-xr-x 2 tony tony 4096 Mar 10 20:19 test ./test: total 0 -rw-r--r-- 1 tony tony 0 Mar 10 20:19 chris 
 for f in *; do [ ! -w "$f" ] || rm -- "$f"; done 

Или с помощью && вместо || :

 [ -w "$f" ] && rm -- "$f" 

(Я предпочитаю || поскольку я использую set -e много, и голый, безуспешный && предложение вызовет выход в этом режиме)

С zsh :

 rm -- *(@,^/e:'[ -w $REPLY ]':) 

То есть, удалите символические ссылки и не-каталоги ( rm не удалит их в любом случае, поэтому мы могли бы также исключить их), для которых у вас есть доступ на запись. Обратите внимание, что квалификатор w glob не может использоваться здесь, поскольку он только проверяет, доступен ли файл для записи его владельцем (который может быть не вами).

  • Как безопасно вставить пароль пользователя в файл?
  • Выполнение сценария оболочки по умолчанию
  • Как распечатать элемент из соответствующего ближайшего следующего столбца после поиска элемента в текущем столбце?
  • Игнорировать escape-символы при печати строки в сценарии оболочки
  • Подождите, пока процесс переднего плана испустит строку, затем отправьте на задний план
  • Как lsof прикрепить к скрипту PID скрипта?
  • Почему «sudo su» в сценарии оболочки не запускает остальную часть скрипта как root?
  • Многократное перенаправление файлов с помощью awk и поиск
  • Асинхронный RPROMPT?
  • Сценарий оболочки для работы с файлами в некотором каталоге
  • Как быстро сканировать беспроводные сети
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.