перемещать файлы со специальными символами в новый каталог

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

for i in /home/*; do case $i in *\?*||*\**||*\$*||*\%*||*\.*||*\'*||*\"*||*\**||*\,* ) mv home/failed; esac done 

Это не должно быть ничего подобного, если есть более короткий или лучший способ достичь этого.

Спасибо заранее, вы, ребята, здорово! Я узнал больше практической информации об очистке Stack Overflow, U & L и т. Д., Чем научил меня BS в области ИТ.

  • Как создать последовательно пронумерованные имена файлов в bash?
  • Простой сценарий bash для резервного копирования и удаления каталогов
  • Знаки процента и переменная среды в сценарии оболочки
  • Базовое имя дает дополнительную ошибку операнда
  • Каков самый простой способ выполнить текст из хвоста в командной строке?
  • Команда Bash в строке выполняется, когда я создаю строку, а не когда я использую ее позже
  • Сценарий Bash для создания скрипта со встроенными значениями
  • Ошибка awk if-then-else
  • 2 Solutions collect form web for “перемещать файлы со специальными символами в новый каталог”

    Здесь следует обратить внимание на то, что имена файлов unix могут содержать символы с любым 8-битным символьным значением, за исключением '/' и '\ 0'.

    Если вы хотите переместить любой файл с символом, который не находится в [AZ] или [az] или подчеркивание, используйте следующее:

     for file in /home/*; do filename=${file##*/} [ -n "${filename//[A-Za-z_]/}" ] && mv "$file" failed/ done 

    Он работает, сначала удалив путь к каталогу, оставив только имя файла. Затем он удаляет все «юридические» символы из имени файла. Если какие-либо символы остаются, то имя файла содержит незаконный символ и будет перемещен.

    Это должно быть модифицировано для использования в скрипте, но если вы делали это из командной строки, вы можете сделать ls -i . Это даст индекс для каждого файла в каталоге. Из этого вы можете использовать find:

    find ./ -i $INODE -exec mv {} <target> \;

    Linux и Unix - лучшая ОС в мире.