web-dev-qa-db-ja.com

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

私のフォルダ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という名前が必要です。

15
Daniel

これを試して:

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

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

削除する場合は/

$ ls -td -- */ | head -n 1 | cut -d'/' -f1
24
cuonglm
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

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

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

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

必須のzsh回答:

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

括弧内の文字は glob qualifiers/はディレクトリのみを照合し、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%/}

できるよ:

ls -td -- ../parent/* | head -n 1
2
Herson

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

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-日付はディレクトリを並べ替え、最後に変更された名前全体を出力します(デフォルトの区切り文字のタブとしてスペースが含まれている場合でも)
2
c-tools