4

すべての*.txtファイルをホームディレクトリからこのスクリプトの最初の引数($ {1})で指定された新しく作成されたディレクトリにコピーするスクリプトを実行する必要があります。

バックアップディレクトリがすでに存在する場合は、スキップします。findを除いて-pruneを試していましたが、うまくいきません。最後に、ループ内のifステートメントを作成しましたが、これも機能しません。理由はわかりません...助けてくれてありがとう!!

これが私のコードです:

#!/bin/bash

mkdir ${1}

for file in $(find ~/ -name *.txt)

do

    if [ ! -f ~/${1}/$file ]
    then
        cp -i -v $file -t ~/${1}
    fi

done
4

3 に答える 3

1

これは行う必要があります:

#!/bin/bash

[[ -n "$1" ]] || { echo >&2 'Give me an argument!'; exit 1; }

destdir=$(readlink -m -- "$1")

[[ "$destdir" == *\** ]] && { echo >&2 "Sorry, I'm in the stupid situation where the destination dir contains the \`*' character. I can't handle this."; exit 1; }

mkdir -pv -- "$destdir" || { echo >&2 "Couldn't create directory \`$destdir'. Sorry."; exit 1; }

find "$HOME" -path "$destdir" -prune -o \( -name '*.txt' -exec cp -iv -t "$destdir" -- {} \; \)

長所:名前にスペースやおかしな記号が含まれているファイルで動作します(あなたの名前とは異なります)(1つのばかげたケースを除いて、以下のConを参照してください)。

短所:ormaajがコメントで指摘したように、宛先パスの名前にパターン文字が含まれていると、これは惨めに失敗する可能性があります*。このケースは安全に考慮され、スクリプトは発生した場合に正常に終了します。

説明。

  • そのスクリプトに引数を与えます。現在のディレクトリを基準にして絶対値にすることができます。readlink-mオプションを使用すると、これを絶対パスに変換するように注意します。これが変数ですdestdir
  • 該当する場合、ディレクトリ$destdirはその親とともに作成されます。
  • ホームディレクトリで、ディレクトリが見つかった場合は$destdirこのブランチを削除します。それ以外の場合は、すべての*.txtファイルを検索してにコピーします$destdir

繰り返しになりますが、このスクリプトは、宛先ディレクトリ名のパターン文字を除いて、スペース、改行文字、またはハイフンなどの面白い記号を含むファイル名に関して100%安全です*が、その場合は、混乱する可能性がなく、正常な終了によって安全に処理されます。ファイル。

于 2012-12-25T22:30:10.603 に答える
0

コードにエラーがあります。ディレクトリを作成しています:

mkdir ${1}

ただし、別のパスをコピーしてテストします(-f ~/${1}/$file-t ~/${1})。このようなエラーを防ぐために変数を作成します。

#!/bin/bash
dest=~/${1}
[ -d "$dest" ] || mkdir "$dest"
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for file in $(find ~/ -name '*.txt' -print)
do
  dfile="$dest/"$(basename "$file")
  if [ "$file" -ef "$dfile" ]; then
    echo same
  else
    cp -i -v "$file" -t "$dfile"
  fi  
done
IFS=$SAVEIFS
于 2012-12-25T21:47:01.920 に答える
0

これを単純化して

mkdir -p "$1"
find ~/ -name "$1" -prune , -name '*.txt' -print0 | xargs -0 cp -n -v -t "$1"

引用する必要があります。引用*.txtしないと、シェルはホームディレクトリの下にある.txtすべてのファイルを検索するのではなく、現在のディレクトリ内のすべてのファイルに展開します。バックアップディレクトリを除外します。.txt-name "$1" -prune

xargscpできるだけ多くのファイル名で呼び出すので、多くの時間を節約できます。

cp -ncp -iすでに存在するファイルの上書きを防ぐ代わりに。そのままにしておきたい場合は、もちろん交換-nすることもできます。-i

ディレクトリ階層を保持したい場合は、rsyncがこのバックアップタスクに適している可能性があります。

于 2012-12-25T22:00:43.200 に答える