これは行う必要があります:
#!/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%安全です*
が、その場合は、混乱する可能性がなく、正常な終了によって安全に処理されます。ファイル。