web-dev-qa-db-ja.com

フォルダをそれ自体に移動するにはどうすればよいですか?

私はディレクトリを持っています

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

しかし、どちらもエレガントではなく、エラーが発生しやすいようです。

それを行うためのより良い方法はありますか?

2
leftaroundabout
$ cd foo
$ mkdir var1
$ mv * var1

シェルとmvコマンドは、var1ディレクトリをそれ自体に移動しようとしないほど賢いです。

4
John

Var1ディレクトリを作成し、foo内のすべてのファイル/フォルダをvar1に移動し、最後にvar1をfoo内に移動するだけです。

    $ mkdir var1 
    $ mv foo/* var1
    $ mv var1 foo/
5
Arushix

ほぼ同じように、ディレクトリの名前を変更して、新しいディレクトリ内に移動します。 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つの異なる理由により)。

2
ilkkachu

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 "{}" \;
1
αғsнιη