私はディレクトリを持っています
foo/
bar.txt
baz.yzw
wun/
a.out
さて、基本的にその間にディレクトリを追加したい、つまり作りたい
foo/
var1/
bar.txt
baz.yzw
wun/
a.out
foo
に他のものも追加することを目的としていますが、古いコンテンツとは別にしています。
もちろん、次のようにすることもできます。
$ mkdir foo-new
$ mv foo foo-new
$ mv foo-new foo
または
$ cd foo
$ mkdir var1
$ mv $(ls | grep -v var1) var1
しかし、どちらもエレガントではなく、エラーが発生しやすいようです。
それを行うためのより良い方法はありますか?
$ cd foo
$ mkdir var1
$ mv * var1
シェルとmv
コマンドは、var1ディレクトリをそれ自体に移動しようとしないほど賢いです。
Var1ディレクトリを作成し、foo内のすべてのファイル/フォルダをvar1に移動し、最後にvar1をfoo内に移動するだけです。
$ mkdir var1
$ mv foo/* var1
$ mv var1 foo/
ほぼ同じように、ディレクトリの名前を変更して、新しいディレクトリ内に移動します。 foo
とその内容の間に_var1/
_を挿入するには:
_d=$(mktemp -d ./tmp.XXXXXX)
mkdir "$d"; mv foo "$d"/var1; mv "$d" foo
_
これは、ディレクトリの内容に対して機能します。ただし、ディレクトリの所有者、アクセスビット、ACL、拡張属性、iノード番号なども考慮すると、少し複雑になります。
foo
をそのまま維持したい場合は、_var1
_を新たに作成し、内容を移動する必要があります。 Bashの使用:
_cd foo
mkdir var1
shopt -s dotglob # to get any dotfiles
mv * var1 # ignore the error about moving var1 to itself
_
または、エラーを回避するには、extglob
を使用します。
_shopt -s extglob
mv !(var1) var1
_
$(ls | grep -v)
にはドットファイルが含まれず、空白または改行を含むファイル名がある場合は機能しないことに注意してください(2つの異なる理由により)。
rsync
を使用すると、宛先ディレクトリ(最後のレベルのみ)がまだ存在しない場合に作成されますが、空のディレクトリが作成され、後で削除するか、保持します。
rsync -rv [--remove-source-files] foo/* foo/var1
オプションがあります-m, --Prune-empty-dirs.
thatPrune empty directory chains from file-list
私のrsyncのマニュアルページにありますが、うまくいきませんでした!
置いた --remove-source-files
中括弧内は[warn]それについて。
空のディレクトリを削除するには:
find foo/ -depth -type d -empty -execdir rmdir "{}" \;