
Привет, у меня есть куча файлов с пробелами в имени, есть ли способ переместить их в новые файлы без пробелов. Например, у меня есть файл Hello World.pdf, я хочу переместить его в Hello_World.pdf. Очевидно, что для одного файла я могу использовать команду mv, но я хочу сделать это для всех файлов в папке.
Спасибо
решение1
Вы можете использоватьтрилиседкоманды для этого:
for file in *.pdf
do
newname=$(echo $file | tr ' ' _)
mv "$file" $newname
done
Обратите внимание, что здесь используется новый синтаксис POSIX для подстановки команд: $(команда).
Если вы используете очень старую оболочку Bourne, вам нужно будет использовать обратные кавычки:
newname=`echo $file | tr ' ' _`
решение2
Вот несколько скриптов, которые я использую для этой задачи:
#!/bin/ksh
# Name : unspace - replace spaces by underscores in file names
# Usage : unspace [file ...]
# Example : unspace *.doc
unspace()
{
ls "$@" | while a=$(line)
do
file=$(echo $a | grep " ")
if [ -n "$file" ]
then
file="$(print "$file" | sed 's/ /_/g')"
print "$a" "->" "$file"
mv "$a" "$file"
fi
done
}
[[ "$(basename $0)" = unspace ]] && unspace "$@"
Следующий пример рекурсивно исправляет все имена в текущем каталоге. Обратите внимание, что все еще требуется некоторая работа, если имена каталогов также содержат пробелы.
#!/bin/ksh
find . |
while a=$(line)
do
newName="$(print $a | tr ' ' '_')"
if [ "$a" != "$newName" ]
then
mv "$a" "$newName"
print $a moved
else
print $a unchanged
fi
done
решение3
если у вас есть bash, нет необходимости вызывать внешние инструменты
for file in *.pdf
do
if [ -f "$file" ];then
echo mv "$file" "${file// /_}"
fi
done