(最新のファイルではなく)最新のディレクトリを取得します


15

私のフォルダparentには次のコンテンツがあります:

A.Folder B.Folder C.File

内部にはフォルダーとファイルの両方があります。B.Folderより新しいです。取得したいのですがB.Folder、どうすればこれを達成できますか?これを試した

ls -ltr ./parent | grep '^d' | tail -1

しかしそれは私に与えますdrwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folderが、私はただ名前が必要B.Folderです。


1
この使用ls -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

awkを使用しても動作しますが、よりクリーンなソリューションがあるかどうかを確認したいと思います。:)
ダニエル

見つける。-maxdepth 1 -type d | TZ = utc xargs ls -ld --full-time | sort -k 6
ctrl-alt-delor 14年

回答:


24

これを試して:

$ ls -td -- */ | head -n 1

-tオプションはls、変更時刻でソートし、新しいものが最初になります。

削除する場合/

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

1
スラッシュを取り除くには/
ダニエル

別のフォルダにいる場合、これは機能しません。私は意味ls -td -- ./parent | head -n 1サブシェルのようなI HAVE TOの使用を行う、私は正しい結果が得られていないcd ./parentすべての時間と、このコマンドを実行しますか?解決策はありますか?
ダニエル

@ダニエル:あなたはそれを動作させるために現在の作業ディレクトリで私の答えを実行する必要があります。それ以外の場合は、Hersonの答えのような相対パスを使用する必要があります。
クオンルム14年

最後の/を削除しても機能しません。例:/ home / cuo / bin /期待:/ home / cuo / bin
マリウス

5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

Hersonのソリューション違いは、の後のスラッシュ*です。これにより、シェルはすべての非dirファイルを無視します。Gnoucとの違いは、別のフォルダーにいる場合に機能します。

Cutは、末尾の「/」を削除するために、親ディレクトリの数(2)を知る必要があります。持っていない場合は

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"

3

必須のzsh回答:

latest_directory=(parent/*(/om[1]))

括弧内の文字は、glob修飾子です。/ディレクトリのみにom一致し、年齢の昇順で一致をソートし[1]、最初の(つまり最新の)一致のみを保持します。Nのサブディレクトリがない場合に空の配列を取得する場合(通常は1要素の配列を取得する場合)に追加しますparent

あるいは、parentシェルのグロビング文字が含まれていないと仮定します。

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

zshはないが、最新のGNUツール(つまり、非組み込みLinuxまたはCygwin)がある場合は、を使用できますがfind、面倒です。1つの方法を次に示します。

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

にはls、ディレクトリ名に改行または(一部のシステムでは)印刷できない文字が含まれていない限り機能する簡単なソリューションがあります。

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}

2

次のコマンドは、ディレクトリ名にスペースが含まれている場合でもジョブを実行します。

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

バックティックの内容の更新された説明は次のとおりです。

  • . -現在のディレクトリ(ここで絶対パスを指定することもできます)
  • -mindepth/-maxdepth -findコマンドを現在のディレクトリの直接の子のみに制限する
  • -type d -ディレクトリのみ
  • -exec stat .. -findからの変更された時刻とディレクトリの名前をタブ(スペースではなく)で区切って出力します
  • sort -n -r |head -1 | cut -f2 -日付はディレクトリを順序付け、最後に変更された名前全体を出力します(カットのデフォルト区切りタブとしてスペースが含まれている場合でも)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.