不幸的是,我还没有找到解决这个问题的办法.我想浏览一个文件夹(包括子文件夹)以查找名称中包含"封面"或"封面"的所有文件,然后将这些文件移到与其当前父文件夹同名的文件夹中,但该新文件夹位于不同的位置.所以

第一个位置:

/mnt/folder1/
-- subfolder 1
---- file.mp3 
---- cover.jpg
-- subfolder 2
---- file2.mp3
---- cover1.jpg

第二个地点:

/mnt/test/folder2
-- subfolder 1
---- otherfile.mp3 
---- **cover from subfolder 1 goes here**
-- subfolder 2
---- otherfile2.mp3
---- **cover from subfolder 1 goes here**

封面文件应该从第一个位置到第二个位置.我已经知道如何找到所有的文件(find . -type f -name "*Cover*.*"),但不知道如何移动它们,因为我无法理解如何将此命令转换为"for f in *cover*.*; do"格式.

谢谢你的一些指导!

推荐答案

使用绝对路径:

src='/mnt/folder1/'
dst='/mnt/test/folder2'

(
    cd "$src" &&
    find -type f -name '*[Cc]over*' \
        -exec echo mv -iv -- {} "$dst"/{} \;
)

这将显示将要运行的mv个命令.

要实际移动文件,请删除echo.


使用while比使用for更常见.类似于:

find ... | while read var; do ...; done

find‘S -exec选项就像是更好的版本,因为它不会被文件名中的陌生字符打断.

Bash还提供nullglobglobstar选项,可直接提供for解决方案:

src='/mnt/folder1/'
dst='/mnt/test/folder2'

(
    shopt -s nullglob globstar

    cd "$src" &&
    for f in **/*[Cc]over*; do
        echo mv -iv -- "$f" "$dst/$f"
    done
)

Linux相关问答推荐

为什么Read()和cin.get()对输出缓冲区的影响不同?

Linux-如何区分目录中名称相同但扩展名不同的所有文件

C++调试器如何知道如何在源代码和可执行文件之间映射行?

不带空格的字符串连接形成文件路径

cu可以从串口读取,但我自己的C程序不能

在 Linux 中屏蔽文件中的位 - 按位运算

如何在 ERE 中结束这个正则表达式

为什么 liburing 写入性能低于预期?

输出特定字符的所有列号

x86_64 Linux 程序集中的逻辑与实现

普通用户 chown(仅更改组)

具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

将以前忽略的目录添加到 Git 存储库

zsh/bash 上不区分大小写的 Glob

rm 没有释放磁盘空间

docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作

使用 C++ 和 Linux 的高分辨率计时器?

在 Ubuntu 中学习 OpenGL

/dev/random 非常慢?

id_rsa.pub 文件 SSH 错误:格式无效