Intereting Posts
bash как перенаправить вывод из функции в / dev / null «Не может писать в файл batman adv kernel» при использовании «mac-address batctl p», DNS-запросы, не использующие nscd для кэширования Изменить владельца для файла резервной копии, созданного backupninja Сколько оперативной памяти должно использовать SSH-соединение? Как настроить малину для получения статического IP-адреса без автоматического назначения IP-адреса DHCP? Как запустить корневую службу из графического интерфейса Могу ли я подключить порт lpt через tcp? Что я делаю неправильно, пытаясь написать сценарий bash, который возвращает номер следующего доступного порта? `Unhandled Exception: System.ArgumentNullException: значение не может быть ошибкой null.` при запуске` dotnet run` с использованием сценария запуска Ядровая паника с использованием ловуарного или тихого Почему лидер Tmux Space также делает 2 лидером? yum install failed с baserepo не найден переменные bash для диапазона петель Как запустить второй оконный менеджер?

Удалите файлы с именами, которые начинаются с ‘?’ в командной строке

Я работаю в стабильной Debian, Cinnamon DE и у меня есть некоторые файлы, которые я хотел бы удалить с помощью командной строки (сейчас я удаляю эти файлы с помощью Nemo).

Например, эти .txt файлы начинаются с ‘?’ в оболочке и в немо это ‘?’ заменяется на возврат каретки:

 $@debian: ls ssolveIncpUL46pK ?ssolveIncpUL46pK.txt 

Немо

Я старался:

  rm ?ss* rm \?ss* rm \ ss* 

Символ не является знаком вопроса. Утилита ls заменит непечатные символы на ? , Кроме того, неясно, является ли непечатаемый символ первым символом в имени файла или перед ним может быть один или несколько пробелов.

Если вы хотите удалить оба этих файла, вы можете сопоставить «плохую часть» с * а затем более точно указать оставшуюся часть видимого имени файла:

 rm -i ./*ssolve* 

Это сначала расширит данный шаблон до всех соответствующих ему имен файлов, а затем rm удалит их. Будьте более конкретны и укажите более длинную часть имени файла, если есть файлы, которые вы не хотите удалять, которые соответствуют приведенному выше короткому шаблону, например, с

 rm -i ./*ssolveIncpUL46pK* 

Это предполагает, что вы находитесь в том же каталоге, что и файлы, которые вы хотите удалить.

Опция -i для rm заставляет запросить подтверждение перед тем, как что-либо удалить.

Надлежащим способом удаления файлов такого типа является использование значения inode файла.

Используйте следующую команду, чтобы получить значение inode

  ls -li 12582925 -rw-r--r-- 1 root root 646 May 23 02:19 ?ssolveIncpUL46pK.txt 

Первое поле в длинном списке результатов – это значение inode.

Затем используйте команду find, чтобы удалить файл с inode.

 find . -inum 12582925 -exec rm -i {} \; 

Не рекомендуется использовать * для удаления файлов. Это может соответствовать больше, чем вам нравится.

Находясь в Debian, команда ls (из GNU) может печатать значения файлов в кавычках [ 1 ] :

 $ ls -Q "\nssolve" "\n\nssolve" "y" "z" 

Или, что еще лучше, перечислите файлы с указанными именами и inode:

 $ ls -iQ 26738692 "\nssolve" 26738737 "\n\nssolve" 26738785 "y" 26738786 "z" 

Затем используйте rm с номером инода, чтобы убедиться, что удаляются только правильные файлы:

 $ find . -xdev -inum 26738737 -exec rm -i {} \; 

Вызов find ограничен одной файловой системой ( -xdev ), чтобы избежать сопоставления файла в другой файловой системе с тем же номером инода. Также обратите внимание, что rm вызывается с параметром -i (интерактивный), поэтому он спросит в командной строке, нужно ли удалять каждый файл.


[ 1 ] Обратите внимание, что это не решает проблему с визуально запутанными символами, такими как кириллица а ($ ‘\ U430’) и латинская a ($ ‘\ U61’), которые выглядят точно так же, но не являются таковыми. Чтобы лучше рассмотреть байты, которые использует имя файла, нам нужно использовать шестнадцатеричный просмотрщик;

 $ touch а a é $'e\U301' $'\U301'e $ ls a ́e é é а # what you "see" here depends on your system. $ printf '<%s>' * | od -An -c < a > < 314 201 e > < e 314 201 > < 303 251 > < 320 260 >