我的目标是找到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.md
和global_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] 删除。
我来说两句