最新のディレクトリのインポート(最新のファイルではありません)

最新のディレクトリのインポート(最新のファイルではありません)

私のフォルダには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 -td -- */ | head -n 1

-tオプションは、ls修正時間に基づいて最新順にソートされます。

削除する場合/:

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

答え2

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

とは違うヘッソンのソリューション*は、シェルがdirではなくすべてのファイルを無視するようにする末尾のスラッシュです。とは違うグヌーク、別のフォルダにある場合は動作します。

Cutは、末尾の「/」を削除するには、親ディレクトリの数(2)を知る必要があります。これがない場合は、以下を使用してください。

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

答え3

zsh強制回答:

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

括弧内の文字はグローバル予選/ディレクトリのみを一致し、om年齢が増加する順に一致をソートし、最初の[1](つまり最新の)一致のみを維持します。Nない場合 。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%/}

答え4

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

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 ..- 修正時間とディレクトリ名をタブで区切って出力します(スペースの代わりに)。
  • sort -n -r |head -1 | cut -f2- 日付でディレクトリを並べ替え、最後に変更されたフルネームを出力します(一部のスペースがカットデフォルトの区切りタブとして含まれている場合でも)

関連情報