AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1161165
Accepted
Zanna
Zanna
Asked: 2019-07-26 23:11:20 +0800 CST2019-07-26 23:11:20 +0800 CST 2019-07-26 23:11:20 +0800 CST

移动一组文件,提示用户确认每个文件

  • 772

系统:Ubuntu MATE 18.04。

我有一个文件集合(在目录结构中的多个目录中),我想将其中的许多移动到另一个目录。我可以通过它们的名称(它们是配方标题)来判断我想要移动哪些文件,但是没有其他方法可以区分我想要移动的文件和我不想移动的文件;我需要通过自己检查名称来为每个文件做出决定。

因此,我为每个要移动的文件运行一次命令,例如

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

即使使用制表符完成,这也是太多的打字。我真正想做的是

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

所以我可以为每个文件按y或n。

如何移动一组文件并提示确认每个文件?

command-line files
  • 2 2 个回答
  • 542 Views

2 个回答

  • Voted
  1. pim
    2019-07-26T23:58:00+08:002019-07-26T23:58:00+08:00

    这是一个小脚本(mv-confirm.sh):

    #!/bin/bash
    
    # Just make sure there are at least one source and one destination
    if [ "$#" -lt 2 ]; then
        echo "Illegal number of parameters"
    fi
    
    DESTINATION=${*:$#}             # last argument
    SOURCES=( ${@:1:$#-1} )         # all but last arguments
    
    for i in "${SOURCES[@]}"
    do
        read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
        echo
        if [[ $REPLY =~ ^[Yy]$ ]]
        then
            echo mv "$i" "$DESTINATION"
        fi
    done
    

    样品用途:

    ./mv-confirm.sh ** somewhere
    move 'a' to 'somewhere' ? [y/n] n
    move 'b' to 'somewhere' ? [y/n] y
    mv b d
    ...
    

    不要忘记使脚本可执行(chmod +x mv-confirm.sh).

    注意

    由于我不想弄乱您的文件,因此我echo在实际mv 命令之前添加了。随意删除它以实际移动文件。

    • 8
  2. Best Answer
    Eliah Kagan
    2019-07-27T06:43:59+08:002019-07-27T06:43:59+08:00

    方式 1:在您的图形文件浏览器中,使用树视图

    我假设您的实际目标是为每个文件做出选择,而不是严格来说要提示. 但是,如果您希望在终端中收到有关每个文件的提示,请参阅下面的方式 2。

    大多数图形文件浏览器都支持树形视图,您可以在其中一起查看目录层次结构的多个级别。您可以单独复制或将文件移出此视图,也可以通过选择它们然后对整个选择进行操作。这甚至适用于来自多个文件夹的文件。

    在某些文件浏览器中,必须进入“首选项”菜单才能启用树视图。在 Caja(MATE 文件浏览器)中,它始终在列表视图中启用。单击查看 → 列表(或按Ctrl+ 2)切换到列表视图。每个目录的左侧都有一个朝右的小三角形,表示它可以展开。要展开文件夹,请单击该三角形,或在→选择文件夹时按(右箭头)键。在这个例子中,我已经一一选择了它们,并且一次将它们全部拖到了目的地:

    在 Caja 文件浏览器的树结构中选择了多个文件,被拖到另一个文件夹但尚未移动

    假设源和目标在同一个驱动器上,默认情况下拖动移动。如果您想复制,请按住该Ctrl键。

    拖动移动完成后的情况,其中选择的文件现在都在目标文件夹中,而不是它们原来的单独位置

    理论上,使用此方法很容易修复错误,因为大多数文件浏览器(包括 Caja)支持Ctrl+Z撤消最近的操作,包括批处理操作。然而,我的运气好坏参半。有时文件会回到错误的文件夹中。

    好消息是您似乎主要使用文本文档,这些文档往往很小,因此您可以tar先进行额外备份,而不会有太多麻烦。无论您使用什么方法,我都建议这样做。

    方式2:find命令与-ok动作

    find查找文件并将其路径传递给使用-exec和操作的任意外部命令是很常见的-execdir。而且每次运行命令之前都有那个提示find。如果您真的想在终端中收到有关每个文件的提示,我认为这是要走的路。-ok-okdir

    完成后产生与上图相同的效果,如下所示:

    ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
    < mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
    < mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
    < mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
    < mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
    < mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
    < mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
    < mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
    < mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
    < mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
    < mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
    < mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
    < mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

    替换Texts为源目录(.如果你愿意cd的话)和Glorious Destination Folder实际的目标目录。

    每个文件运行一个命令;与-execand不同-execdir,-ok并且-okdir不支持+在\;同一命令调用中传递多个找到的路径。因此,您不需要使用-t dest. mv不过,我建议无论如何都这样做,尤其是find在这种情况下,这样提示看起来更像他们正在提示的命令。

    在编写该命令时,如果find遇到最终指向常规文件的符号链接,它(链接,而不是目标)将被移动而不是被忽略。如果您真的只想操作一个常规文件,请-type f使用-xtype f.

    您可能希望在script会话中执行此操作,这样您就可以弄清楚如果您犯了错误会发生什么。但同样,没有理由不进行备份。

    方式3:生成清单并编辑它

    至少只要文件的名称中没有换行符,您就可以首先使用一个简单的find命令来生成清单——该文件列出了您(在这种情况下可能)感兴趣的文件的名称:

    find Texts -xtype f >manifest
    

    用您喜欢的任何名称替换manifest列出正在考虑的文件的文件(并相应地调整其余方向)。

    如上所述,Texts用你的实际源目录替换,.如果你已经cd'd 到它。但是,如果Texts是相对路径(包括 if it's .),那么您应该确保稍后在实际执行移动时位于同一位置。

    运行该find命令后,manifest在文本编辑器中打开。这可能是nano, vim, emacs, gedit,pluma等。在编辑器中,通过在开头放置 a 来注释掉那些命名您不想移动的文件的行。#一些编辑器会以不同的方式突出显示这些行,即使它无法识别您的文件是它知道有注释的任何格式。不过,大多数人不会这样做,而我建议这样做的真正原因是,作为人类,您可能有在配置文件(也可能在源代码中)注释行的经验。我认为这比标记你想要移动的线更直观,更不容易出错。

    当然,您也可以只删除您不想移动的文件的行。将它们注释掉的好处是稍后您会清楚地知道您做了什么。

    在我的示例中,这是文件内容在我编辑后的样子:

    Texts/Robert Frost/New Hampshire.pdf
    # Texts/Robert Frost/In The Clearing.pdf
    Texts/Helen Keller/The Story of My Life.pdf
    Texts/Saki/The Short Stories of Saki.pdf
    # Texts/Jane Austen/Sense and Sensibility.pdf
    Texts/Jane Austen/Pride and Prejudice.pdf
    # Texts/Richard Connell/The Stolen Crime.pdf
    Texts/Richard Connell/The Most Dangerous Game.txt
    # Texts/Mary Wollstonecraft Shelley/Mathilda.epub
    Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
    # Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
    Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

    然后,您可以过滤掉注释行grep并将结果通过管道xargs传递给mv:

    grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'
    

    如上,替换Glorious Destination Folder为实际目的地的名称。而已; 你的文件被移动了。echo如果您愿意,您当然可以在之前编写mv以查看将首先运行的命令。

    该命令的工作方式是:

    1. 该grep命令从不( ) 开始 ( ) 的行manifest中输出带有可选 ( ) 空格 ( ) 后跟文字字符的行。该标志选择 PCRE 作为正则表达式的方言(我认为它比传统的更具可读性)。-v^*\s#-P\s[[:space:]]
    2. 该xargs命令将其输入(即 的输出grep)划分为以换行符结尾的字段 ( ),然后将每个字段(不带终止换行符)作为单独的参数粘贴到它运行-d '\n'的命令末尾。mv -t 'Glorious Destination Folder'
    • 6

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve