使用 bash `find` 使用文件夹名称重命名文件

万事通

我的目标是找到README.md在子文件夹中命名的所有文件,并将它们复制到一个output文件夹中,使用其原始文件夹的名称作为新名称。

好吧,这听起来很复杂。让我们看一个具体的例子:

baselines
├── combined_tree_local_conflict_obs
│   ├── README.md
│   └── sparse_small_apex_maxdepth2_spmaxdepth30.yaml
└── global_density_obs
    ├── README.md
    └── sparse_small_apex_expdecay_maxt1000.yaml

我想在复制README.md文件到output与名称的文件夹combined_tree_local_conflict_obs.mdglobal_density_obs.md

所以最后我会有:

baselines
├── output
│   ├── combined_tree_local_conflict_obs.md
│   └── global_density_obs.md
├── combined_tree_local_conflict_obs
│   ├── README.md
│   └── sparse_small_apex_maxdepth2_spmaxdepth30.yaml
└── global_density_obs
    ├── README.md
    └── sparse_small_apex_expdecay_maxt1000.yaml

我不明白为什么我的 bash 命令不起作用:

$ find baselines -type f -name "README.md" -exec echo output/$(basename $(dirname {})).md \;
output/..md
output/..md

(我还没有复制文件,只是打印它们的新路径来调试命令。)

find 命令确实有效:

$ find baselines -type f -name "README.md" -exec echo {} \;
baselines/combined_tree_local_conflict_obs/README.md
baselines/global_density_obs/README.md

提取文件夹名称确实有效:

$ echo $(basename $(dirname "baselines/combined_tree_local_conflict_obs/README.md"))
combined_tree_local_conflict_obs

但!不知何故,当我把它们放在一起时它不起作用。

我对如何以另一种方式解决这个问题不太感兴趣,而是想了解为什么我的命令不起作用。

吉尔斯·奎诺

就像查尔斯·达菲 (Charles Duffy)在评论中解释的那样,

$(basename $(dirname {}))在 find 甚至开始之前运行。它不可能对找到的特定文件的名称进行操作。

我有一些更好的解决方案...

第一的:

cd baselines

然后,像这样重新使用您的代码:

find . -type f -name "README.md" -exec bash -c '
    echo cp "$1" "./output/$(dirname "$1").md"
' -- {} \;

要么

find . -type f -name "README.md" -exec bash -c '
    for file; do
        echo cp "$file" "./output/$(dirname "$file").md"
    done
' -- {} +

检查https://mywiki.wooledge.org/UsingFind

要么

for file in */README.md; do
    echo cp "$file" "./output/$(dirname "$file").md"
done

echo当输出看起来不错时删除命令(不要尝试提供 bash STDIN)。


cp ./combined_tree_local_conflict_obs/README.md ./output/./combined_tree_local_conflict_obs.md
cp ./global_density_obs/README.md ./output/./global_density_obs.md

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:使用唯一名称重命名MultiPartFile并将其存储到文件夹并将URL保存到数据库

如何在python中逐行使用文本文件的新名称重命名文件夹中的文件名

在不同文件夹中使用相同名称重命名文件

使用文件夹名称重命名文件夹中的所有图像

使用备用BaseName查找(CSV)名称重命名文件

使用bash匹配文件夹名称

递归bash脚本,用于在Mac / Linux上使用特定规则重命名文件和文件夹

如何使用文件夹名称重命名文件列表

如何使用bash批量重命名文件

Bash使用find -exec重命名360 000个文件

从文件夹名称重命名文件的Bash脚本问题

遍历文件夹并使用文件夹名称顺序重命名每个文件夹中的所有文件

如何使用目录名称重命名文件?

使用单个bash命令批量重命名文件夹

使用Samba安装上的古怪名称重命名文件

如何使用其他文件夹中文件的相同名称重命名多个图像?

使用bash查找文件并使用新名称重复?

我可以使用父文件夹的名称重命名文件夹中的文件吗?

使用Bash重命名文件

如何使用其父目录的名称重命名文件?

如何使用bash检索目录中的文件夹名称

Bash:使用文件夹名称重命名文件(每个文件夹 1 个)

使用父文件夹的名称重命名子文件夹中的文件

使用文件夹名称重命名文件并将它们移动到一个大文件夹

将文件从子文件夹复制到父文件夹并使用父文件夹名称重命名文件

使用 VBA 重命名文件夹

查找 index.html 文件并使用文件夹名称重命名并将文件向上移动一个级别

如何使用 bash 添加两列 DataFrame 并使用前缀名称重命名

如何使用 bash 添加两列 DataFrame 并使用前缀名称重命名