
ディレクトリがあります
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
しかし、どちらもエレガントに見えず、エラーが発生しやすいです。
もっと良い方法がありますか?
答え1
単にvar1ディレクトリを作成し、foo内のすべてのファイル/フォルダをvar1に移動し、最後にvar1をfooの中に移動できます。
$ mkdir var1
$ mv foo/* var1
$ mv var1 foo/
答え2
$ cd foo
$ mkdir var1
$ mv * var1
シェルとmv
コマンドは、var1ディレクトリを独自に移動しようとしないほどスマートです。
答え3
私はあなたがやったようにディレクトリの名前を変更し、新しいディレクトリに移動します。とvar1/
の間に内容を挿入するにはfoo
:
d=$(mktemp -d ./tmp.XXXXXX)
mkdir "$d"; mv foo "$d"/var1; mv "$d" foo
これはディレクトリの内容に適用されます。しかし、ディレクトリ所有者、アクセスビット、ACL、拡張属性、inode 番号なども考慮すると少し複雑になります。
そのままにするには、コンテンツを再作成して移動するfoo
必要があります。var1
強打の使用:
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つの理由)。
答え4
rsync
まだ存在しない場合は、それを使用してターゲットディレクトリ(最後のレベルのみ)を作成できますが、これにより後で削除または保持される空のディレクトリが作成されます。
rsync -rv [--remove-source-files] foo/* foo/var1
一つのオプション-m, --prune-empty-dirs.
はprune empty directory chains from file-list
私の同期マニュアルページにありますが、私はそれを得ることができませんでした!
--remove-source-files
中かっこの中に入れました。[警告する]それについて。
空のディレクトリを削除します。
find foo/ -depth -type d -empty -execdir rmdir "{}" \;