搜索文件夹,查找并将文件复制到新文件夹对应的文件结尾

搜索文件夹,查找并将文件复制到新文件夹对应的文件结尾

我设法用 photorec 获取了几个硬盘的一些数据,但我不知道这些文件是如何保存的,而且在这些文件中搜索也不是很方便recup_dir.*。所以我的想法是按文件结尾分类。所以所有的 *.gif 都以 或类似的结尾/home/mike/photorec/12gb/sorted/gif。但我不知道如何搜索根目录,获取文件扩展名并移动/cp 到该文件夹​​(如果不存在,则创建该文件夹)。

这样,我就可以删除不必要的文件夹/文件,例如dll

假设我有三个文件夹:

~/photorec/80gb
~/photorec/120gb
~/photorec/100gb

Photorec 创建了大量文件夹命名等recup_dir.1,例如:recup_dir.2

.
├── recup_dir.1
├── recup_dir.10
├── recup_dir.11
├── recup_dir.12
└── recup_dir.9
    ├── f21750248.jpg
    ├── f21750275.gif
    ├── f21750277.gif
    ├── f21750281.gif
    ├── f21750296.jpg

我想要cd 80gb,在里面运行一个命令或执行一个 bash 脚本,~/photorec/80gb/以便创建一个新的文件夹,sorted并在里面排序我从中获取所有文件recup_dirs,并按找到的文件扩展名排序。

.
├── recup_dir.1
├── recup_dir.10
├── recup_dir.11
├── recup_dir.12
├── sorted
    ├── gif
        ├── f21750275.gif
        ├── f21750277.gif
        ├── f21750281.gif
    ├── jpg
        ├── f21750248.jpg
        ├── f21750296.jpg

我怎样才能实现这个目标?

编辑:这不仅仅是 photorec。它当然可以是任何文件夹。

答案1

首先,创建一些测试文件:

mkdir -p 80gb/recup_dir.{1,10,11,12,9}
touch 80gb/recup_dir.9/f00{1..3}.{jpg,png,gif}

得出:

.
└── 80gb
    ├── recup_dir.1
    ├── recup_dir.10
    ├── recup_dir.11
    ├── recup_dir.12
    └── recup_dir.9
        ├── f001.gif
        ├── f001.jpg
        ├── f001.png
        ├── f002.gif
        ├── f002.jpg
        ├── f002.png
        ├── f003.gif
        ├── f003.jpg
        └── f003.png

现在:

find 80gb -type f -exec bash -c 'mkdir -p sorted/"${0##*.}"; mv "$0" sorted/"${0##*.}"' {} \;

$0保存当前文件名{}脚本) "${0##*.}"是文件的扩展名。

结果:

.
├── 80gb
│   ├── recup_dir.1
│   ├── recup_dir.10
│   ├── recup_dir.11
│   ├── recup_dir.12
│   └── recup_dir.9
└── sorted
    ├── gif
    │   ├── f001.gif
    │   ├── f002.gif
    │   └── f003.gif
    ├── jpg
    │   ├── f001.jpg
    │   ├── f002.jpg
    │   └── f003.jpg
    └── png
        ├── f001.png
        ├── f002.png
        └── f003.png

如果您想要sorted下面的目录,80gb最简单的方法可能是cd 80gb先执行,然后执行,find . … 而不是find 80gb …

相反,mv您可能首先想做的事情cp是,以防出现任何问题。

警告

表达式"${0##*.}"仅适用于文件带有扩展名。对于没有扩展名的文件,它将返回完整的文件名(包括路径),并且命令将失败。如果您希望文件没有扩展名,请将命令修改为:

find 80gb -type f -name "*.*" -exec … \;

所以它只捕获带有点的文件。

答案2

bash这是一种使用globstar选项并循环遍历不同扩展名来一次移动一个扩展名的所有文件的方法:

shopt -s globstar
for i in $(find -type f -name "*.*" -printf '%p\n' | sed 's/.*\.//' | sort -u); do \
  mkdir -p sorted/"$i"; \
  mv **/*."$i" sorted/"$i"; \
done

命令列表find | sed | sort创建循环循环的现有文件扩展名列表for。对于每个扩展名,mkdir在其下创建一个目录sorted/并将匹配的文件放入其中。m是globstar 模式,并匹配(理论上)无限的目录和子目录,请参阅v**/man bash/SHELL 内建命令在 shopt/globstar 下。

示例运行

$ mkdir -p 80gb/recup_dir.{1,10,11,12,9}
$ touch 80gb/recup_dir.9/f00{1..3}.{jpg,png,gif}
$ tree
.
└── 80gb
    ├── recup_dir.1
    ├── recup_dir.10
    ├── recup_dir.11
    ├── recup_dir.12
    └── recup_dir.9
        ├── f001.gif
        ├── f001.jpg
        ├── f001.png
        ├── f002.gif
        ├── f002.jpg
        ├── f002.png
        ├── f003.gif
        ├── f003.jpg
        └── f003.png
$ shopt -s globstar; for i in $(find -type f -name "*.*" -printf '%p\n' | sed 's/.*\.//' | sort -u); do mkdir -p sorted/"$i"; mv **/*."$i" sorted/"$i"; done
$ tree
.
├── 80gb
│   ├── recup_dir.1
│   ├── recup_dir.10
│   ├── recup_dir.11
│   ├── recup_dir.12
│   └── recup_dir.9
└── sorted
    ├── gif
    │   ├── f001.gif
    │   ├── f002.gif
    │   └── f003.gif
    ├── jpg
    │   ├── f001.jpg
    │   ├── f002.jpg
    │   └── f003.jpg
    └── png
        ├── f001.png
        ├── f002.png
        └── f003.png

相关内容