[英]How to sort output of the find command in a script
我有以下簡單的腳本來查找最近N天添加的所有目錄(深度為2)...
#!/bin/bash
DAYS_PRIOR=180
DIR='/mydir'
FILES=`find $DIR -mindepth 2 -maxdepth 2 -type d -mtime -$DAYS_PRIOR -printf '%f\\\n'`
echo
echo "Files added in the last $DAYS_PRIOR days:"
echo
echo -e $FILES
echo
為了使其添加換行符,我不得不兩次轉義printf並使用echo -e
。 這對我來說似乎很奇怪,但這是我唯一可以在輸出的每行打印一個目錄的方法。
至此一切正常,我得到了預期的目錄列表。 現在,我想按字母順序對列表進行排序。 我嘗試將find命令中的printf更改為...
FILES=`find <xxx> -printf '%f\\\n' | sort`
但是,這不會對目錄名稱進行排序。 根據其他帖子,我嘗試了以下操作。
FILES=`find <xxx> -printf %f\\\n | sort -t '\0' | awk -F '\0' '{print $0; print "\\\n"}'`
這非常接近,但是在每行的開頭都留出了額外的空間,並且看上去很尷尬。
是否有一種簡單的方法可以將排序添加到原始的find
命令?
第一:雙引號引用您的變量! 當您使用echo -e $FILES
,變量FILE
的值將基於空格(空格,制表符和換行符)分成“單詞”,然后echo
這些單詞及其之間的空格粘在一起。 這具有將換行符轉換為空格的作用。 為了最后使用換行符,您必須使用\\n
而不是真正的換行符,並使用echo -e
進行轉換。 只需使用實際的換行符,然后在變量引用周圍加上雙引號即可避免所有此類混亂:
FILES=$(find "$DIR" -mindepth 2 -maxdepth 2 -type d -mtime "-$DAYS_PRIOR" -printf '%f\n')
# ...
echo "$FILES"
請注意,我在所有變量引用周圍都加上了雙引號,因為這幾乎總是一個好主意。 我還使用$( )
代替了反引號-它更易於閱讀,並且避免了反引號具有的某些解析奇數。
無論如何,使用這種格式,您在整個過程中都使用適當的換行符,因此通過sort
管道應該可以按預期工作。
順便說一句,我還建議從大寫變量名切換為小寫或大小寫混合名,因為有一堆具有特殊含義的全大寫名稱,如果不小心使用其中之一,可能會發生不好的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.