Второй mkdir
не хочет $PWD
:
now=$(date +"%m_%d_%Y")
DIR="/nmr/charlie"
mkdir $DIR/cx1_$now
for name in $(find $DIR -maxdepth 1 -type d)
do
if [[ "$name" != "$DIR" ]]
then
(cd $DIR/cx1_$now; mkdir $name)
(cd $DIR/$name
cp file1.ext $DIR/cx1_$now/$name
cp file2.ext $DIR/cx1_$now/$name
)
fi
done
Кроме того, PWD является встроенной переменной; вы не должны устанавливать его (за исключением команды cd
).
Вам не нужен симметричный тест в if
; вы можете использовать !=
вместо =
, чтобы избежать пустого предложения then
(хорошо, он содержит приятный анонимный код :
, он вам не нужен, если вы инвертируете тест).
Я обычно кладу cd
операции в подклассы; таким образом, я становлюсь менее смущенным. Альтернатива для второй линии mkdir
это, что не нуждается в cd
или подоболочке:
mkdir -p $DIR/cx1_$now/$name
Я рекомендую использовать формат ISO 8601 для дат, такие как:
now=$(date +"%Y_%m_%d")
Таким образом, каталоги сортируются в порядке дат автоматически.
I still get the error:
mkdir: cannot create directory `/nmr/charlie/directory_name_1': File exists
/home/charlie/Desktop/scripts/test.sh: line 16: cd: /nmr/charlie//nmr/charlie/directory_name_1: No such file or directory
Проблема, вероятно, означает, что мы пока правильно не фильтруется. Например, каждый раз, когда вы создаете резервную директорию, все предыдущие резервные каталоги будут скопированы в новый, что немного чрезмерно. Таким образом, другая часть упражнения лучше фильтрует выход find
.
... И мы должны использовать базовое имя каталога, и мы можем избежать всех cd
операций тоже:
now=$(date +"%m_%d_%Y")
DIR="/nmr/charlie"
mkdir $DIR/cx1_$now
for name in $(find $DIR -maxdepth 1 -type d | grep -v '/cx1_[^/]*$')
do
if [[ "$name" != "$DIR" ]]
then
targetdir=$DIR/cx1_$now/$(basename $name)
mkdir -p $targetdir
cp $name/file1.ext $name/file2.ext $targetdir
fi
done
Вы знаете об использовании «ш -х script.sh» или ' bash -x script.sh ', чтобы запустить скрипт и посмотреть, что он делает.Я даже не уверен, что нам нужно условие if
с grep
, отфильтровывающее все, что похоже на каталог резервного копирования из списка.
Отмечу, что это работает только в том случае, если пути к каталогам являются нормальными и не содержат пробелов. Дела идут не так быстро, если вы используете непереносимые имена файлов (где переносные имена используют только [-_.A-Za-z0-9]
). Новые линии и пространства действительно создают беспорядок.
Обратите внимание, что это было бы проще, если вы сделали резервную копию в каталогах под /nmr/backup/charlie
или в любом другом месте, кроме /nmr/charlie
. Однако, с осторожностью, это может быть сделано in situ по запросу.
Включите ошибку в вопросе – keyser
вы можете отлаживать скрипт вставляя 'установить -vx' в верхней части сценария. (Ниже приведены ответы, чтобы решить проблему). Удачи. – shellter