
次の 2 つの投稿に続きます:
https://askubuntu.com/questions/870844/ディレクトリ名をファイル名に再帰的に追加
同じことを、移動ではなくコピーで行いたいです。簡単に言うと、サブディレクトリとサブサブディレクトリを含むディレクトリがあり、その中にいくつかのファイルがあります。すべてのファイルを別の宛先フォルダにコピーしたいのですが、一部のファイルには正確な名前が付いているため、ファイル名のプレフィックスとして親ディレクトリの名前を添付したいと思います。
私は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//\//-}"'