我有一个父/ 文件夹,里面有几个子文件夹。结构:
/parent/
/subfolder_1/
- file_1.txt
- file_2.txt
/subfolder_2/
- file_3.txt
- file_4.txt
现在,我需要递归移动 父/ 文件夹的内容到空 parent_tmp / 目录。事实是,我需要将原始文件夹结构保留在父/ 。
中搬家后的预期结果:
/parent/
/subfolder_1/
(empty)
/subfolder_2/
(empty)
/parent_tmp/
/subfolder_1/
- file_1.txt
- file_2.txt
/subfolder_2/
- file_3.txt
- file_4.txt
通常,我只会做
mv parent/* parent_tmp
但是,这当然会永久地移动子文件夹。
有没有办法调整mv
命令以保留源目录的原始结构?
注意:
我意识到我可以,例如将父级/ 复制到 parent_tmp ,然后删除父级/ 子文件夹中的文件。这是我的计划B.
答案 0 :(得分:2)
您可以复制文件
cp -r parent/* parent_tmp/
或创建硬链接(大文件应该快得多)
cp -l -r parent/* parent_tmp/
然后删除原始文件
find parent -type f -delete
同时保持目录结构。
答案 1 :(得分:2)
您可以使用find
和parent
导演父母的parent_tmp
:
find parent -type f -exec bash -c 'mkdir -p "parent_tmp/${1%/*}" &&
mv "$1" "parent_tmp/${1%/*}"' - {} \;
答案 2 :(得分:1)
压缩父文件夹的内容并将其解压缩到目标文件夹中。
答案 3 :(得分:1)
快速和肮脏:
我认为你不会在mv命令中找到一个工具或选项来做你想做的事情,但你应该能够通过使用find来实现预期目标:
cd parent && while read file ; do dirname="$(dirname "$file")" ; mkdir -p ../parent_tmp/"$dirname"/; mv "$file" "../parent_tmp/"${file#}"" ; done < <( find . -type f ) && cd -
<强>功能强>
如果您经常使用它,那么您可以将上面的内容添加到您的〜/ .basrc中(附加到文件的末尾):
alias mvkp=moveandkeep
moveandkeep() {
cd "$1"
while read file ;
do dirname="$(dirname "$file")" ;
mkdir -p "$2"/"${dirname#}";
mv "$file" ""$2"/"${file#}"";
done < <(find . -type f)
cd -
}
现在您只需执行以下操作:(所需目录的完整路径)
mvkp /home/user/parent /home/user/parent_tmp