方法一:在图形文件浏览器中,使用树视图

方法一:在图形文件浏览器中,使用树视图

系统:Ubuntu MATE 18.04。

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

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

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

即使使用 tab 补全功能,输入的内容也太多了。我真正想要做的是

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

因此我只需对每个文件按下y或即可。n

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

答案1

这是一个小脚本(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 命令之前添加了。您可以随意删除它以实际移动文件。

答案2

方法一:在图形文件浏览器中,使用树视图

我认为你的实际目标是为每个文件做出选择,而不是严格地说提示。但是,如果您希望在终端中提示每个文件,请参阅下面的方法 2。

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

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

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

假设源和目标位于同一驱动器上,则默认拖动即可。如果您想复制,请按住 键Ctrl

拖拽完成后,选中的文件全部集中到目标文件夹,而不是原来单独的位置

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

好消息是,您似乎主要处理的是文本文档,这些文档通常较小,因此您可以tar先进行额外备份,而不必费太多力气。无论您使用哪种方法,我都建议您这样做。

方法 2find带有-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实际的目标目录进行替换。

这将为每个文件运行一个命令;与-exec和不同-execdir-ok-okdir不支持+代替\;在同一命令调用中传递多个找到的路径。因此,您不需要需要使用-t dest的形式mv。我建议无论如何都这样做,尽管一般来说特别是find在这种情况下,提示看起来更像他们提示的命令。

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

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

方法三:生成清单并编辑

至少只要文件名称中没有换行符,您就可以使用简单的find命令来生成显现——一个列出您(在本例中可能)感兴趣的文件名称的文件:

find Texts -xtype f >manifest

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

如上所述,用您的实际源目录替换,如果您已经找到它,Texts则可能是。但是,如果是相对路径(包括如果它是),那么您应该.cdTexts.确保在同一位置当你真正做出这些动作的时候。

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

当然,你也可以删除注释掉那些你不想移动的文件。注释掉它们的好处是以后你所做的一切会一目了然。

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

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

相关内容