私のファイル構造は次のとおりです
FOLDER/SUB_FOLDER/Text_File
私はそれらのうちの1,000以上を持っておりFOLDER
、それぞれは少なくともFOLDER
2つの異なるものを持っています。SUB_FOLDER
SUB_FOLDER
Text_File
私は一番多くのリストを作るために自分自身に挑戦しようとしています。最近 Text_File
党FOLDER/
(ルート)
My Pseudo code is (as well as commands I know right now):
List all FOLDERS
- **ls -t [EACH_FOLDER] | head -n1 **
**ls -t EACH_FOLDER/SUB_FOLDER/**
**ls Text_File**
出力は次のようになります。
/FOLDER/SUB_FOLDER/Text_File
...
すべてのファイル。
私の目標は、すべてのルートディレクトリのすべての最新のText_FileをgrepしてFOLDER
情報を解析することです。
答え1
#!/bin/bash
# Array of root folders
folders=("a" "b")
# Search all specified root folders
for f in ${folders[@]}; do
# Descend hierarchy and retrieve modification date of each file with "stat"
find $f -type f -exec stat -f "%m,%N" {} ';' | \
# sort by date, most recent first
sort -gr | \
# extract first (most recent) file
head -1 | \
# return file name only
cut -d, -f2
done
答え2
あなたはgnu
試すことができます:
find "$(pwd)" -mindepth 2 -maxdepth 2 -type d -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
/^d/ {directoryname=substr($0,2)}
/^[0-9]/ && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
lmtimes[directoryname]=$1;
lmtimedns[directoryname]=substr($0,index($0," ")+1);
}
END {for (directoryname in lmtimedns) print lmtimedns[directoryname]}
'
\n
"
このバージョンは、特殊文字などを含む奇妙な名前に対してテストされました。
$(pwd)
pwd
現在のディレクトリの絶対パス名を印刷するコマンドを実行します。
find $(pwd)
現在のディレクトリを検索すると、完全なディレクトリパス名が印刷されます。
フィルタは、現在のディレクトリのレベルが1でレベル2の2-mindepth 2 -maxdepth 2 -type d
番目のレベルのディレクトリのみを選択します。FOLDER
SUB_FOLDER
-printf "d%h\0%T@ %p\0"
見つかった各SUBFOLDER
メッセージを次のように印刷します。
d
FOLDER
\0
last modif time in second since EPOCH
[space]
SUBFOLDER
\0
など。
\0
名前の一部にすることはできないので、これは完璧な区切り記号です。
awk -v RS="\0"
\0
記録区切りとして考慮しています。
/^d/ {directoryname=substr($0,2)}
:regex
レコードが;で始まるd
場合に該当します。directoryname
変数は、生成によって文字FOLDER
の後に続くすべての文字で構成される名前で更新されます。d
printf
/^[0-9]/
:regex
レコードが数字で始まる場合に該当します。構成によると、printf
現在のレコードの最初のフィールド($1
例えば、[space]
文字までのすべての文字)には、最後の変更時刻が含まれます。
&& (!lmtimes[directoryname] || lmtimes[directoryname] < $1)
:連帯連想配列([キー、値]ペアのマップ)です。SUBFOLDER
Current FOLDER
(directoryname
)現在の最近の最後の変更時刻を保存するために使用されます。true
最後の修正時刻が保存されていないdirectoryname
か、最後の修正時刻が現在時刻より前に保存されたかを示しますSUBFOLDER
。
次の式がtrueの場合、最後の変更時刻と名前はキーをFOLDER
使用してdirectoryname
保存されます。連帯そしてリアルタイムドメインネームシステム、それぞれ。
END {for (...
:すべての履歴が解析されたら、SUBFOLDER
最後に変更された時刻とともに各名前を印刷します。
----
履歴の場合、このコマンドは各ディレクトリに対して最後に変更されたファイル名を一覧表示します。
find "$(pwd)" -depth -type f -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
/^d/ {
directoryname=substr($0,2);
}
/^[0-9]/ {
if (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
lmtimes[directoryname]=$1;
lmtimefns[directoryname]=substr($0,index($0," ")+1);
}
}
END {
for (directoryname in lmtimefns) {
print lmtimefns[directoryname];
}
}'