2番目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
。空の句を避けるため!=
に代わりに使用できます(OK、いい anodyneコマンドが含まれています。テストを反転する場合は必要ありません)。=
then
:
私は通常、cd
操作をサブシェルに入れます。そうすれば、私は混乱することが少なくなります。2 行目の代替案は次のとおりです。これは、またはサブシェルmkdir
を必要としません。cd
mkdir -p $DIR/cx1_$now/$name
日付には、次のような ISO 8601 形式を使用することをお勧めします。
now=$(date +"%Y_%m_%d")
そうすれば、ディレクトリは日付順に自動的にソートされます。
私はまだエラーが発生します:
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
better の出力をフィルタリングすることです。
...そして、ディレクトリのベース名を使用する必要があり、すべての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
「sh -x script.sh」または「bash -x script.sh」を使用してスクリプトを実行し、それが何をしているかを確認することについて知っていますか。リストからバックアップディレクトリのように見えるものをすべて除外するif
条件が必要かどうかさえわかりません。grep
これは、ディレクトリ パスが正常で、スペースが含まれていない場合にのみ機能することに注意してください。移植性のないファイル名 (移植性のある名前[-_.A-Za-z0-9]
のみが使用される場合) を使用すると、事態は急速に悪化します。改行とスペースは本当に混乱します。
/nmr/backup/charlie
ディレクトリの下またはそれ以外の場所にバックアップを作成した場合、これはより簡単になることに注意してください/nmr/charlie
。ただし、注意すれば、要求に応じてその場で行うことができます。