複数のディレクトリのファイルの並べ替えとコピー

複数のディレクトリのファイルの並べ替えとコピー

ファイルを含む複数のサブディレクトリがあるディレクトリがあります。

各ディレクトリのファイルを名前でアルファベット順に並べ替え、各ディレクトリの最初のファイルを指定された新しいディレクトリにコピーしたいと思います。

  • 隠しファイルを無視したいです。
  • ターゲットディレクトリに同じ名前のファイルがある場合は、両方のファイルを保存する必要があります。

サンプル:

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また、未使用のファイル名を探すループに潜在的な競合状態があります。これはおそらく問題ではありませんが、複数のコピーを並列に実行するなどのことはしないでください。

おすすめ記事