次の2つの投稿に続きます。
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//\//-}"'