我有一个目录
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 "{}" \;