【问题标题】:How to move certain files from one directory to another, while maintaining directory structure如何将某些文件从一个目录移动到另一个目录,同时保持目录结构
【发布时间】:2020-11-05 01:42:15
【问题描述】:

如何将文件从源目录移动到目标目录,而目标目录保持源目录的原始目录结构?

例如,给定源目录

source
├── source_sub
│   ├── ex_one.txt
│   ├── ex_two.sh
│   ├── source_sub_sub
|   │   ├── ex_three.txt
|   │   ├── ex_four.sh
│   ├── source_unmoved_dir
|   │   ├── ex_five.sh

我想将所有文本文件从源目录移动到目标目录,结果如下:

destination
├── source_sub
│   ├── ex_one.txt
│   ├── source_sub_sub
|   │   ├── ex_three.txt

在目标中,名为source_unmoved_dir 的源目录不会移动,因为它不包含任何.txt 文件。

到目前为止,我正在遍历源代码中的所有文件和目录。当我遇到一个文件时,我只需使用mv $file $dest 移动它。对于目录,我只提出了这个mv $file $dest/。这将递归地将目录和子目录从源移动到目标。但是,它也会移动目录及其子目录中的每个文件。我不知道如何只在目录/子目录中添加.txt文件。

到目前为止,这是我的脚本:

for file in "$src"/*; do
    if [[ -d $file ]]; then
        mv $file $dest
    elif [[ -f $file ]]; then
        if [[ $file == *.txt ]]; then
            mv $file $dest
        fi
    fi
done

【问题讨论】:

  • 如果这是“一次性”,我只会 1) 将我想要移动的文件/目录转储到文本文件中,2) 找到具有“块模式”的编辑器,3)将最左边的列设置为mv ,4) 将右列阻止编辑到您希望该行上的文件移动到的任何目录路径,5) 当您满意时执行脚本。即使您有数百个文件,它也可能比想一个“聪明”的方式来做这件事更快/更容易。还有一个LOT“更安全”(“聪明”脚本中的一个错误很容易破坏您的文件系统)。
  • 其实很巧妙。我会努力做到的。

标签: linux bash


【解决方案1】:

这是一个使用find 的可能解决方案,我们循环遍历在源目录中找到的所有 .txt 文件。此命令说“在路径 ${SOURCE_DIR} 中查找所有以 .txt (-name "*.txt") 结尾的文件 (-type f)”。

对于以这种方式找到的每个文件,我们:

  • 找出目标目录中文件所需的new_path(不包括文件本身的名称)
  • 使new_pathmkdir -p不关心目录是否已经存在,所以如果我们尝试多次创建相同的(子)目录就可以了)
  • 将文件移至其new_path
#!/bin/bash

SOURCE_DIR=source
DEST_DIR=destination

for txt_file in $(find "${SOURCE_DIR}" -type f -name "*.txt"); do
        new_path=$(dirname "$txt_file" | sed "s~${SOURCE_DIR}~${DEST_DIR}~")
        mkdir -p "${new_path}"
        mv "${txt_file}" "${new_path}"
done

您只需将SOURCE_DIRDEST_DIR 的定义替换为您自己的路径即可。

如果您还想从源目录中删除空目录,可以将其添加为该脚本的最后一行:

find "${SOURCE_DIR}" -type d -empty -delete

【讨论】:

  • 谢谢你。一般来说,我对 bash 和 Linux 还是很陌生,所以我会以你的回答作为提示,并尝试自己实现一段时间。感谢您的帮助。
【解决方案2】:

这里已经回答https://unix.stackexchange.com/a/2503/30055

您只需将 *.pdf 更改为 *.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 2017-07-20
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多