系统: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)切换到列表视图。每个目录左侧都有一个向右的小三角形,表示可以展开。要展开文件夹,请单击该三角形,或→在选择文件夹时按(右箭头)键。在此示例中,我已逐一选择它们,并将它们一次全部拖到目的地:
假设源和目标位于同一驱动器上,则默认拖动即可。如果您想复制,请按住 键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
实际的目标目录进行替换。
这将为每个文件运行一个命令;与-exec
和不同-execdir
,-ok
和-okdir
不支持+
代替\;
在同一命令调用中传递多个找到的路径。因此,您不需要需要使用-t dest
的形式mv
。我建议无论如何都这样做,尽管一般来说特别是find
在这种情况下,提示看起来更像他们提示的命令。
正如该命令所写,如果find
遇到最终指向常规文件的符号链接,则它(链接,而不是目标)将被移动而不是忽略。如果您确实只想操作一个常规文件,请使用-type f
而不是-xtype f
。
你可能想在script
会话,这样您就可以弄清楚如果犯了错误会发生什么。但同样,没有理由不进行备份。
方法三:生成清单并编辑
至少只要文件名称中没有换行符,您就可以使用简单的find
命令来生成显现——一个列出您(在本例中可能)感兴趣的文件名称的文件:
find Texts -xtype f >manifest
manifest
将列出正在考虑的文件的文件替换为您喜欢的任何名称(并相应地调整其余的方向)。
如上所述,用您的实际源目录替换,如果您已经找到它,Texts
则可能是。但是,如果是相对路径(包括如果它是),那么您应该.
cd
Texts
.
确保在同一位置当你真正做出这些动作的时候。
运行该find
命令后,manifest
在文本编辑器中打开。这可以是、、、、nano
等。vim
在编辑器中,emacs
gedit
pluma
注释掉命名文件的行不通过在行首放置一个 来移动要移动的行#
。有些编辑器会以不同的方式突出显示这些行,即使它无法识别您的文件是它知道有注释的任何格式。不过,大多数编辑器不会这样做,我建议这样做的真正原因是,作为一个人,您可能有在配置文件(也许在源代码中)中注释行的经验。我认为这比标记您要标记的行更直观,也更不容易出错。做想要搬家。
当然,你也可以删除注释掉那些你不想移动的文件。注释掉它们的好处是以后你所做的一切会一目了然。
在我的示例中,这是我编辑文件后的文件内容:
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
以查看将首先运行的命令。
该命令的工作方式是:
- 该
grep
命令输出manifest
以下行不( )以可选的 ( )空格 ( )-v
开头( ),后跟文字字符。该标志选择 PCRE 作为正则表达式的方言(我认为这比传统的 更具可读性)。^
*
\s
#
-P
\s
[[:space:]]
- 该
xargs
命令将其输入(即 的输出grep
)分成以换行符结尾的字段( ),然后将每个字段(不带终止换行符)作为单独的参数粘贴到其运行的-d '\n'
命令的末尾。mv -t 'Glorious Destination Folder'