簡體   English   中英

如何在腳本中對find命令的輸出進行排序

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

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