![mvとcpディレクトリ階層? [コピー]](https://linux33.com/image/57303/mv%E3%81%A8cp%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E9%9A%8E%E5%B1%A4%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
mv
私またはcp
ファイルを使用するときにファイルのディレクトリ階層を移動またはコピーすることはできますか?
たとえば、Imv
または他の場所の場合は、またはcp
dir1/dir2/file
のみです。私もそれが欲しいならどうしますか?命令語ではありませんか?mv
cp
file
mv
cp
dir1/dir2
mkdir -p dir1/dir2
答え1
cp
利用可能なスイッチ--parents
:
$ mkdir -p step1/step2/step3
$ touch step1/step2/step3/file
$ mkdir copy
$ cp --parents step1/step2/step3/file copy
$ ls copy/step1/step2/step3/file
copy/step1/step2/step3/file
mv
ただし、スイッチはありませんが、--parents
次のことができます。
$ find step1/step2/step3 -name "file" -exec cp --parents {} copy/ \; -delete
これは次のことを行います。
- ファイルを探します。
- そのアイテム(およびその親アイテム)をターゲットにコピーします。
- 原稿を削除してください。
これを行うための関数を作成できます。
mvparents()
{
[[ $# -ne 2 ]] && echo "2 arguments needed." && return
[[ ! -r "$1" ]] && echo "$1 is not readable." && return
[[ ! -d "$2" ]] && mkdir -p "$2"
find $(dirname $1) -name "$(basename $1)" -exec cp --parents {} $2/ \; -delete
}
$ mvparents step1/step2/step3/file copy/
複数のファイルを移動する場合は、少し調整が必要な場合があります。これは例です(bashでは機能しますが、他のシェルでは保証されていません)。
mvparents()
{
[[ $# -lt 2 ]] && echo "Usage: $0 [source] <source> ... [destination]." && return
# Get the destination directory.
for dest; do true; done
[[ ! -d "$dest" ]] && mkdir -p "$dest"
# Copy the arguments and remove the destination.
parameters=( "$@" )
unset parameters[${#parameters[@]}-1]
# For each source file: find, copy, delete.
for source in "${parameters[@]}"; do
if [ -r "$source" ]; then
find $(dirname $source) -name "$(basename $source)" -exec cp --parents {} $dest/ \; -delete
else
echo "$0: $source is not readable."
fi
done
}
うーん...予想より少し時間がかかりましたが、作業は完了します
編集:同様セバスチャン・ピエッチコメントで指摘したように、cp
仕事に頼るのは当初必要ではないので、mv
パフォーマンスを低下させる要因です。mv
コピーファイルのメタデータを編集するだけです。上記のループを次のように置き換えることができます。
for source in "${parameters[@]}"; do
if [ -r "$source" ]; then
[[ ! -d "$dest/$(dirname $source)" ]] && mkdir -p "$dest/$(dirname $source)"
find $(dirname $source) -name "$(basename $source)" -exec mv {} "$dest/$(dirname $source)" \; -delete
else
echo "$0: $source is not readable."
fi
done
しかし、これはたくさんの価値については$PWD
ご利用において格別のご注意をお願いします。