サブディレクトリとサブディレクトリのすべてのファイルをプライマリディレクトリにコピーし、すべての親ディレクトリのプレフィックスを追加してファイル名を変更します。

サブディレクトリとサブディレクトリのすべてのファイルをプライマリディレクトリにコピーし、すべての親ディレクトリのプレフィックスを追加してファイル名を変更します。

次の2つの投稿に続きます。

https://askubuntu.com/questions/871898/move-files-to-parent-directory-prefixing-file-name-with-former-subdirectory-nam

https://askubuntu.com/questions/870844/recursively-add-directory-name-to-file-name

私は同じことをしたいのですが、移動の代わりにコピーしたいです。簡単に言えば、サブディレクトリがあるディレクトリと、内部にいくつかのファイルがあるサブサブディレクトリがあります。すべてのファイルを別の宛先フォルダにコピーしたいのですが、一部のファイルの名前が正しいため、親ディレクトリの名前をファイル名の前にプレフィックスとして追加したいと思います。

Ubuntu 16.04で実行中です。

答え1

努力する:

find  -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;

(コマンドが大丈夫に見える場合は「echo」を削除してください)

.
└── 1
    └── 2
        ├── 3
        │   └── 4
        │       └── foo.dat
        └── foo.dat

生産する:

cp ./1/2/3/4/foo.dat ./1-2-3-4-foo.dat
cp ./1/2/foo.dat ./1-2-foo.dat

デフォルトでは、cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"ソースパスのすべてのエントリを 。/-tinyscript

答え2

パフォーマンスではなく単純さを考慮すると、これは特に効率的ではありません(各ファイルに対してbashプロセスを開始するため)。ファイルの数が多い場合や重要な要因の場合は、より複雑なソリューションが必要になる場合があります。

find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'

関連情報