【问题标题】:Using awk to print ALL spaces within filenames which have a varied number of spaces使用 awk 打印具有不同数量空格的文件名中的所有空格
【发布时间】:2015-01-05 18:54:31
【问题描述】:

我正在使用 bash 和 awk 执行以下操作,以获取可能空间已满的文件名、冒号、文件大小。 (第 5 列包含空格分隔的大小,第 9 列是 EOL 文件名):


src="Desktop"
echo "Constructing $src files list.  `date`"
cat /dev/null > "$src"Files.txt

find -s ~/"$src" -type f -exec ls -l {} \; | 

   awk  '{for(i=9;i<=NF;i++) {printf("%s", $i " ")} print ":" $5}' |

   grep -v ".DS_Store" | grep -v "Icon\r" |

   while read line ; do filespacesize=`basename "$line"`; filesize=`echo "$filespacesize" |

     sed -e 's/ :/:/1'`

     path=`dirname "$line"`;  echo "$filesize:$path" >> "$src"Files.txt ;

  done

而且效果很好,但是…… 如果文件名的部分之间有 > 1 个空格,我只会在文件名部分和冒号之间得到 1 个空格,然后是文件大小。

如何获取完整的文件名、: 以及文件大小?

【问题讨论】:

标签: bash parsing awk


【解决方案1】:

您似乎想要以下内容(假设您的 find 使用 %f%s%h 修饰符处理 printf 选项):

src=Desktop
echo "Constructing $src files list.  $(date)"
find ~/"$src" -type f -printf '%f:%s:%h\n' > "$src"Files.txt

比你的方法更短更高效!


这不会丢弃 .DS_STOREIcon\r 的东西……但我不确定你真正想要丢弃什么。如果您想完全放弃.DS_STORE 目录

find ~/"$src" -name '.DS_STORE' -type d -prune -o -type f -printf '%f:%s:%h\n' > "$src"Files.txt

@guido 似乎猜到了你所说的grep -v "Icon\r" 的意思:忽略以Icon 结尾的文件;如果他的猜测是正确的,那么就可以了:

find ~/"$src" -name '.DS_STORE' -type d -prune -o ! -name '*Icon' -type f -printf '%f:%s:%h\n' > "$src"Files.txt

【讨论】:

  • 我认为 Icon\r 用于排除以 Icon 结尾的文件(\r 是 ls -l 每行输出后的换行符)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2018-07-21
  • 2018-11-20
相关资源
最近更新 更多