ファイルを含む複数のサブディレクトリがあるディレクトリがあります。
各ディレクトリのファイルを名前でアルファベット順に並べ替え、各ディレクトリの最初のファイルを指定された新しいディレクトリにコピーしたいと思います。
- 隠しファイルを無視したいです。
- ターゲットディレクトリに同じ名前のファイルがある場合は、両方のファイルを保存する必要があります。
サンプル:
parentdir
->dir1
->afile
->bfile
->cfile
->dir2
->dfile
->efile
->ffile
->dir3
->afile
->hfile
->ifile
次のように新しいディレクトリを入力するコマンドを実行したいと思います。
newdir
->afile
->afile.1
->dfile
これはどのように達成できますか?
ベストアンサー1
最も簡単な方法は、コピー先を使用してls
ファイルを一覧表示することです。head
このbashスクリプトに示されているように:
for d in ./*/; do
src="$(ls "$d" | head -n 1)"
dstbase="newdir/$(basename "$src")"
if [[ ! -f "$dstbase" ]]; then
cp "$src" "$dstbase"
else
suffix=1
while [[ -f "$dstbase.$suffix" ]]; do
let suffix++
done
cp "$src" "$dstbase.$suffix"
fi
done
当然、それに応じてファイルパスを調整する必要があります。コピーするときなど、下のディレクトリを除外しようとするとdir1
問題が発生する可能性があるため、これは非常に脆弱です。dir2
また、未使用のファイル名を探すループに潜在的な競合状態があります。これはおそらく問題ではありませんが、複数のコピーを並列に実行するなどのことはしないでください。