如何将文件夹移入其自身?

如何将文件夹移入其自身?

我有一个目录

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

shell 和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)不包括点文件,并且如果您的文件名包含空格或换行符(出于两个不同的原因),它将不起作用。

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

相关内容