如何批量移动文件至上一个目录

如何批量移动文件至上一个目录

我在 /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 不是大多数文件系统中文件/目录的允许代码点。不过,我自己从未尝试过这样做。

相关内容