/dev/null | while read dir do echo -6ren">
gpt4 book ai didi

linux - 从 "find"输出中删除特殊字符

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:33 24 4
gpt4 key购买 nike

我正在尝试列出一个文件夹中的所有子文件夹:

find . -type d -maxdepth 1 -mindepth 1 2>/dev/null | while read dir
do
echo $dir

done

但是,我打印出来的是

./dir1
./dir2

虽然我只需要

dir1
dir2

完整用例:
稍后,我想用文件夹的名称创建一个新文件,例如:

find . -type d -maxdepth 1 -mindepth 1 2>/dev/null | while read dir
do
echo 'MOVING TO'$dir
cd $dir
#SUMMARYLOG=$dir_log_merged # HERE IS WHERE THE ./ IS PROBLEMATIC
# QUESTION EDITED
SUMMARYLOG=${dir}_log_merged # HERE IS WHERE THE ./ IS PROBLEMATIC

echo -e "\n""\n"'SUMMARY LOGS TO '$SUMMARYLOG
touch $SUMMARYLOG
pwd

find . -size +0c -type f -name '*.err' | xargs -I % sh -c 'echo % >> {$SUMMARYLOG}; cat % >> "{$SUMMARYLOG}"; echo -e "\n" >> "{$SUMMARYLOG}"'

cat $SUMMARYLOG
cd ..
done

基本上,我想在每个子文件夹中合并一组 .err 文件,并创建一个具有子文件夹名称的文件。我无法创建我的 $SUMMARYLOG 所以我认为问题出在查找输出 ./dir...

最佳答案

您可以使用 glob 和参数扩展来代替 find 技巧:

for d in */; do echo "${d%/}"; done

"${d%/}" 从每个目录名称中删除尾部斜杠。

如果你有隐藏目录,你必须添加第二个 glob 因为 */ 会忽略它们:

for d in */ .[!.]*/; do echo "${d%/}"; done

其中 .[!.]*/ 是一个 glob,表示“以 . 开头,后面跟着除另一个 . 之外的任何内容”,排除 ....

除此之外,如果您有 $dir,则不能使用 $dir_log_merged_log_merged 附加到它,因为 Bash 会查找名为 dir_log_merged 的变量。您必须改用 ${dir}_log_merged

另一组问题是在以

开头的 xargs 命令中
sh -c  'echo % >> {$SUMMARYLOG};
  • 单引号防止变量展开
  • SUMMARYLOG 在子 shell 中是不可见的;你必须先export
  • {$SUMMARYLOG} 扩展为 $SUMMARYLOG 的内容(在您的情况下为空字符串),然后用 {} 包围它,这就是为什么您会看到正在创建 {} 文件
  • 您不能在 sh -c 命令中这样使用 %。您必须将它用作 sh -c 的参数,然后像这样引用它:

    sh -c 'echo "$1"' _ %

    _ 作为虚拟参数,在 sh -c 命令中变为 $0

最后,我将按如下方式解决您的任务:

for f in */*.err; do
! [[ -s $f ]] && continue # Skip empty files
{
echo "${f##*/}" # Basename of file
cat "$f" # File contents
echo # Empty line
} >> "${f%/*}/${f%/*}_log_merged" # Dirname plus new filename
done

关于linux - 从 "find"输出中删除特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46934266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com