簡體   English   中英

從“查找”輸出中刪除特殊字符

[英]Remove special characters from “find” output

我正在嘗試列出文件夾中的所有子文件夾:

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所以我認為問題出在find輸出./dir ...

您可以使用glob和參數擴展,而不是find雜技:

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

其中"${d%/}"從每個目錄名中刪除尾部斜杠。

如果你有隱藏的目錄,你必須添加第二個glob作為*/忽略它們:

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

where .[!.]*/是一個用“以...開頭.后跟除了另一個之后的任何東西. ”的全局,以排除. ..

除此之外,如果你有$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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM