[英]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.