系统: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。
如何移动一组文件并提示确认每个文件?
这是一个小脚本(
mv-confirm.sh
):样品用途:
不要忘记使脚本可执行(
chmod +x mv-confirm.sh)
.注意
由于我不想弄乱您的文件,因此我
echo
在实际mv
命令之前添加了。随意删除它以实际移动文件。方式 1:在您的图形文件浏览器中,使用树视图
我假设您的实际目标是为每个文件做出选择,而不是严格来说要提示. 但是,如果您希望在终端中收到有关每个文件的提示,请参阅下面的方式 2。
大多数图形文件浏览器都支持树形视图,您可以在其中一起查看目录层次结构的多个级别。您可以单独复制或将文件移出此视图,也可以通过选择它们然后对整个选择进行操作。这甚至适用于来自多个文件夹的文件。
在某些文件浏览器中,必须进入“首选项”菜单才能启用树视图。在 Caja(MATE 文件浏览器)中,它始终在列表视图中启用。单击查看 → 列表(或按Ctrl+ 2)切换到列表视图。每个目录的左侧都有一个朝右的小三角形,表示它可以展开。要展开文件夹,请单击该三角形,或在→选择文件夹时按(右箭头)键。在这个例子中,我已经一一选择了它们,并且一次将它们全部拖到了目的地:
假设源和目标在同一个驱动器上,默认情况下拖动移动。如果您想复制,请按住该Ctrl键。
理论上,使用此方法很容易修复错误,因为大多数文件浏览器(包括 Caja)支持Ctrl+Z撤消最近的操作,包括批处理操作。然而,我的运气好坏参半。有时文件会回到错误的文件夹中。
好消息是您似乎主要使用文本文档,这些文档往往很小,因此您可以
tar
先进行额外备份,而不会有太多麻烦。无论您使用什么方法,我都建议这样做。方式2:
find
命令与-ok
动作find
查找文件并将其路径传递给使用-exec
和操作的任意外部命令是很常见的-execdir
。而且每次运行命令之前都有那个提示find
。如果您真的想在终端中收到有关每个文件的提示,我认为这是要走的路。-ok
-okdir
完成后产生与上图相同的效果,如下所示:
替换
Texts
为源目录(.
如果你愿意cd
的话)和Glorious Destination Folder
实际的目标目录。每个文件运行一个命令;与
-exec
and不同-execdir
,-ok
并且-okdir
不支持+
在\;
同一命令调用中传递多个找到的路径。因此,您不需要使用-t dest
.mv
不过,我建议无论如何都这样做,尤其是find
在这种情况下,这样提示看起来更像他们正在提示的命令。在编写该命令时,如果
find
遇到最终指向常规文件的符号链接,它(链接,而不是目标)将被移动而不是被忽略。如果您真的只想操作一个常规文件,请-type f
使用-xtype f
.您可能希望在
script
会话中执行此操作,这样您就可以弄清楚如果您犯了错误会发生什么。但同样,没有理由不进行备份。方式3:生成清单并编辑它
至少只要文件的名称中没有换行符,您就可以首先使用一个简单的
find
命令来生成清单——该文件列出了您(在这种情况下可能)感兴趣的文件的名称:用您喜欢的任何名称替换
manifest
列出正在考虑的文件的文件(并相应地调整其余方向)。如上所述,
Texts
用你的实际源目录替换,.
如果你已经cd
'd 到它。但是,如果Texts
是相对路径(包括 if it's.
),那么您应该确保稍后在实际执行移动时位于同一位置。运行该
find
命令后,manifest
在文本编辑器中打开。这可能是nano
,vim
,emacs
,gedit
,pluma
等。在编辑器中,通过在开头放置 a 来注释掉那些命名您不想移动的文件的行。#
一些编辑器会以不同的方式突出显示这些行,即使它无法识别您的文件是它知道有注释的任何格式。不过,大多数人不会这样做,而我建议这样做的真正原因是,作为人类,您可能有在配置文件(也可能在源代码中)注释行的经验。我认为这比标记你想要移动的线更直观,更不容易出错。当然,您也可以只删除您不想移动的文件的行。将它们注释掉的好处是稍后您会清楚地知道您做了什么。
在我的示例中,这是文件内容在我编辑后的样子:
然后,您可以过滤掉注释行
grep
并将结果通过管道xargs
传递给mv
:如上,替换
Glorious Destination Folder
为实际目的地的名称。而已; 你的文件被移动了。echo
如果您愿意,您当然可以在之前编写mv
以查看将首先运行的命令。该命令的工作方式是:
grep
命令从不( ) 开始 ( ) 的行manifest
中输出带有可选 ( ) 空格 ( ) 后跟文字字符的行。该标志选择 PCRE 作为正则表达式的方言(我认为它比传统的更具可读性)。-v
^
*
\s
#
-P
\s
[[:space:]]
xargs
命令将其输入(即 的输出grep
)划分为以换行符结尾的字段 ( ),然后将每个字段(不带终止换行符)作为单独的参数粘贴到它运行-d '\n'
的命令末尾。mv -t 'Glorious Destination Folder'