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

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

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

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

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

  • Как удалить. с начала строки Bash и записать результат в переменную?
  • Избегание ожидания в bash без команды sleep
  • Сравнение файлов с vimdiff из скрипта
  • Вывод трубы одной команды двум другим
  • Команда для снятия скриншота с нового файла
  • Bash: перемещать файлы определенного шаблона
  • Сценарий для подключения с ssh к удаленному серверу с паролем
  • Сопоставьте несколько регулярных выражений из одного файла с помощью awk
  • 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 - лучшая ОС в мире.