我在 /home/ 中有大约 200 个目录。问题是它们都以这种方式存在:
/home/{用户}/homedir/
虽然它应该只是:
/主页/ {用户} /
使用什么命令我可以为每个用户将 homedir 的所有内容批量移动至上一个目录?
谢谢您的帮助。
答案1
这可能取决于你的 shell,但假设 bash:
for a in $(find /home -maxdepth 1 -type d); do mv $a/homedir/* $a/; rmdir $a/homedir; done
find
在运行完整命令之前,单独运行该命令以验证列表是否符合您的预期rmdir
,如果要保留homedir
每个文件夹中的空内容,请删除该部分。
答案2
除非超出命令行长度,否则使用 globsmv /home/*/* /home
应该可以工作。请注意,如果您有文件,/home/user
这些文件也将被移动到/home
。
答案3
将主目录内容上移一个目录:
cd /home
for i in */homedir; do /bin/mv $i/* $i/.. && /bin/rmdir $i; done
答案4
SmallClanger 的解决方案可以进行更改,这样空格就不再是问题了。诀窍是将 Bash 的内部字段分隔符(一个变量 callend IFS,通常包含一个空格和一个换行符)更改为仅包含一个换行符。例如:
IFS=$'\n'
这会将 IFS 更改为当前 shell 的换行符。
之后您可以运行 SmallClanger 的命令,或者类似的命令:
for item in $(find ./homedir -mindepth 1 -maxdepth 1 -type d); do
echo " --> \"$item\"" >&2
mv "$item" .
done
假设您的工作目录是“/home/{user}”。
第一次尝试查看 $item 包含的内容时,您可以省略“mv”行。如果看起来不错,则使用“mv”运行它。不要忘记“$item”周围的双引号。
这样,只有当您的任何文件或文件夹路径包含换行符时,您才会遇到问题,我认为这比包含空格要不寻常得多。
有关内部字段分隔符的一些信息: Bash:内部变量
我还认为您可以让“find”程序将其结果用 NUL 分隔开。如果可以将 IFS 设置为 NUL,那么几乎任何事情都可以放心,因为通常 NUL 不是大多数文件系统中文件/目录的允许代码点。不过,我自己从未尝试过这样做。