Я бы не стал выполнять цикл for
из-за возможности перегрузки командной строки.Командные строки имеют ограниченную длину, и если вы перегрузите их, они просто сбросят лишние, не предупреждая вас.Это может сработать, если ваша находка вернет 100 файлов.Он может работать, если он возвращает 1000 файлов, но может не работать, если ваш поиск возвращает 1000 файлов, и вы никогда не узнаете.
Лучший способ справиться с этим - передать поиск в оператор чтения в виде glenn jackman .
Команда sed работает только на STDIN и на файлах, но не на именах файлов, поэтому, если вы хотите изменить имя файла, вам придется сделать что-то подобное:
$newname="$(echo $oldname | sed 's/old/new/')"
, чтобы получить новое имя файла.Конструкция $()
выполняет команду и помещает результаты команды в STDOUT.
Итак, ваш скрипт будет выглядеть примерно так:
find /home/devel/stuff/static/ -name "*.pdf" | while read $file
do
echo $file;
newfile="$(echo $file | sed -e 's/static/changethis/')"
newfile="$newfile.xml"
echo $newfile;
done
Теперь, так как вы переименовываете файловый каталог, вам нужно убедиться, что каталог существует, прежде чем вы сделаетепереместить или скопировать:
find /home/devel/stuff/static/ -name "*.pdf" | while read $file
do
echo $file;
newfile="$(echo $file | sed -e 's/static/changethis/')"
newfile="$newfile.xml"
echo $newfile;
#Check for directory and create it if it doesn't exist
$dirname=$(dirname "$newfile")
if [ ! -d "$dirname" ]
then
mkdir -p "$dirname"
fi
#Directory now exists, so you can do the move
mv "$file" "$newfile"
done
Обратите внимание на кавычки, если в имени файла есть пробел.
Кстати, вместо этого:
if [ ! -d "$dirname" ]
then
mkdir -p "$dirname"
fi
Вы можете сделать это:
[ -d "$dirname"] || mkdir -p "$dirname"
||
означает выполнить следующую команду, только если тест не соответствует действительности.Таким образом, если [-d "$ dirname"] является ложным утверждением (каталог не существует), вы запускаете mkdir
.
Это довольно распространенный ярлык, когда вы видите сценарии оболочки.