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

Ada*_*dam 5 command-line bash

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

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

假设我有三个文件夹:

~/photorec/80gb
~/photorec/120gb
~/photorec/100gb
Run Code Online (Sandbox Code Playgroud)

Photorec产生大量的文件夹命名的recup_dir.1recup_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
Run Code Online (Sandbox Code Playgroud)

我想在里面cd 80gb运行一个命令或执行一个 bash 脚本,~/photorec/80gb/以便创建一个新文件夹sorted,然后在里面 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
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

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

Per*_*uck 4

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

\n
mkdir -p 80gb/recup_dir.{1,10,11,12,9}\ntouch 80gb/recup_dir.9/f00{1..3}.{jpg,png,gif}\n
Run Code Online (Sandbox Code Playgroud)\n

这给出:

\n
.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 80gb\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.1\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.10\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.11\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.12\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 recup_dir.9\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.gif\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.jpg\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.gif\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.jpg\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f003.gif\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f003.jpg\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.png\n
Run Code Online (Sandbox Code Playgroud)\n

现在:

\n
find 80gb -type f -exec bash -c 'mkdir -p sorted/"${0##*.}"; mv "$0" sorted/"${0##*.}"' {} \\;\n
Run Code Online (Sandbox Code Playgroud)\n

$0保存当前文件名(scriptlet{}的参数),\n是文件的扩展名。"${0##*.}"

\n

结果:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 80gb\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.10\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.11\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.12\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 recup_dir.9\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sorted\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gif\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.gif\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.gif\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.gif\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jpg\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.jpg\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.jpg\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.jpg\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.png\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.png\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

相反,mv您可能首先想做的cp是\以防万一出现问题。

\n

警告

\n

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

\n
find 80gb -type f -name "*.*" -exec \xe2\x80\xa6 \\;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

  • 另一种测试方法是在“mv”命令前面添加“echo”,这样您就可以看到将执行什么命令 (2认同)
  • 是的,@dessert,如果速度很重要那就更好了——在这种特殊情况下我对此表示怀疑。我很懒,想避免使用过长的命令,其中包含多个丑陋的表达式;-) (2认同)

des*_*ert 3

这里 \xe2\x80\x99s 是一种通过使用bash\xe2\x80\x99sglobstar选项并循环不同扩展名来一次移动一个扩展名的所有文件的方法:

\n\n
shopt -s globstar\nfor i in $(find -type f -name "*.*" -printf \'%p\\n\' | sed \'s/.*\\.//\' | sort -u); do \\\n  mkdir -p sorted/"$i"; \\\n  mv **/*."$i" sorted/"$i"; \\\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

运行示例

\n\n
$ mkdir -p 80gb/recup_dir.{1,10,11,12,9}\n$ touch 80gb/recup_dir.9/f00{1..3}.{jpg,png,gif}\n$ tree\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 80gb\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.1\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.10\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.11\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.12\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 recup_dir.9\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.gif\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.jpg\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.gif\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.jpg\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f003.gif\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f003.jpg\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.png\n$ 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\n$ tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 80gb\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.10\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.11\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 recup_dir.12\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 recup_dir.9\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sorted\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gif\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.gif\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.gif\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.gif\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jpg\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.jpg\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.jpg\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.jpg\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f001.png\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 f002.png\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 f003.png\n
Run Code Online (Sandbox Code Playgroud)\n