2016-01-22 17 views
0

Я следующий сценарий, чтобы избавиться от символов, которые система FAT32 не хотели:Как обрабатывать вопросительные знаки в команде mv?

bad_chars="\?:\|\"*" 
F=`find . | grep [$bad_chars] | head -n1` 
while [ "$F" != "" ] 
do 
    new_F=`echo $F` | sed s/[$bad_chars]/_/g` 
    mv "$F" "$new_F" 
    F=`find . | grep [$bad_chars] | head -n1` 
done 

Теперь это застревание на файлы с вопросительными знаками, он приходит с ошибкой

mv: rename ./[FILE_PATH]/What? _.pdf to ./[FILE_PATH]/What_ _.pdf: No such file or directory. 

Это не относится ко всем файлам с вопросительными знаками, я попытался добавить файл dummy ?.txt, и он обработал его в порядке. Существуют другие PDF-файлы в одном пути, но они не похожи по имени.

+1

Если у вас есть утилита переименования вы можете уменьшить его просто 'найти Exec/xargs rename'. Также, как вы это делаете, ломаются имена файлов с новыми символами в них. И вопросительные знаки, скорее всего, не являются вопросительными знаками, а другими плохими персонажами, которых вы не видите. – 123

+0

Я знаю, что это не плохой символ, потому что 'sed' меняет его, и я обнаружил странные символы юникода, которые я вложил в bad_chars, и он отлично их рисует. К сожалению, у меня нет использования переименования (помогая кому-то другому на своем mac) – Cramer

+0

Sed изменит его, потому что вы просто передаете ему строку с вопросительным знаком, а не фактическим именем файла. – 123

ответ

1

Я думаю, что этот сценарий может быть упрощена совсем немного:

#!/bin/bash 

shopt -s globstar # enable recursive expansion with ** 
shopt -s nullglob # expand to nothing if no files match the pattern 

bad_chars="\?:\|\"*" 
for i in **/*["$bad_chars"]*; do 
    mv "$i" "${i//[$bad_chars]/}" 
done 
+0

Судя по комментариям OP, они работают, когда они создают файл с '?', Тогда у него, вероятно, будут те же проблемы, что и у OP. – 123

+0

Полностью работает для меня с файлами или без них, содержащими '?' - не совсем уверен, что проблема была там, но код OP по-прежнему немного сломан, так как в строке присваивается значение 'new_F'. –

+0

Могу сказать, что он не будет работать с странными символами, которые, вероятно, связаны с OP, поскольку они уже сказали, что это работает, когда они создают файл с '?' В нем. Также может потребоваться упомянуть, что globstar работает только в bash 4+ – 123