这是mv
我们可以用来在 Ubuntu 20.04 上移动文件/文件夹的唯一命令吗?
答案1
mv
该工具移动文件的方式是让文件的索引节点保持不变(除非文件被移动到不同的文件系统)并保留其所有权和权限。其他工具提供不同的选项。cp
与 不同,该命令mv
在文件系统中创建一个具有新 inode 位置的全新数据对象。
mv
无需使用内置命令cp
即可模仿动作rm
:
cp example/foo .
ls -l -G -g --inode
7476869 -rwxrwxr-x. 29545 Aug 2 11:58 foo
rm example/foo
来源:修订自不使用 mv 在 Linux 上移动文件
答案2
mv
跨文件系统
- 复制文件并删除原始文件。
对于文件:
cp source target && rm source
对于目录:
cp -r source target && rm -rf source
mv
到同一个文件系统:
- 创建到您的 inode 的新链接并删除原始链接。
ln
因此,您可以使用&&模拟同一文件系统上的移动rm
:
ln source target && rm source
但是,这仅适用于文件。
要递归移动目录,您可以编写一个小脚本/函数:
#!/bin/bash
lmv()(
set -eu
s="$1"
t="$2"
if [ -f "$s" ]; then
printf '%s -> %s\n' "$s" "$t"
ln "$s" "$t"
rm "$s"
elif [ -d "$s" ]; then
printf '%s -> %s\n' "$s" "$t"
mkdir "$t"
shopt -s dotglob
for e in "$s"/*; do
lmv "$e" "$t/${e##*/}"
done
rmdir "$s"
else
>&2 printf 'No file or directory: %s\n' "$s"
exit 1
fi
)
用法:
lmv source target
(注意:该脚本仅仅是一个概念证明,缺少一些东西,例如多个来源或保留所有者和权限等。)