フォルダをフォルダ自体に移動するには?

フォルダをフォルダ自体に移動するには?

ディレクトリがあります

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 "{}" \;

関連情報