我正在尝试列出文件夹中的所有子文件夹:
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
...
答案 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