从"中删除特殊字符"产量

时间:2017-10-25 13:51:29

标签: linux shell find

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

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 ...

1 个答案:

答案 0 :(得分:3)

而不是find杂技,你可以使用glob和参数扩展:

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

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

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

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

其中.[!.]*/是一个以“.开头,后跟除了.之外的任何内容”的全局,以排除...。< / p>

除此之外,如果您有$dir,则无法使用$dir_log_merged_log_merged追加dir_log_merged,因为Bash会查找名为${dir}_log_merged的变量。您必须改为使用xargs

另一组问题出现在以{/ 1>开头的sh -c 'echo % >> {$SUMMARYLOG}; 命令中

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

    _

    $0作为伪参数,在sh -c命令中变为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

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

awk