web-dev-qa-db-ja.com

Cygwinを使用して、複数のフォルダーの「変更日」を、各フォルダー内にある.mkvと同じになるように変更する方法

複数のフォルダの「変更日」を、各フォルダ内の.mkvと同じになるように変更する方法。

例えば。ファイル1.mkvを含むfolder1があります

folder1: 2/17/14
1.mkv: 1/6/12

Folder1に「日付を変更」させたい1/6/12

もあります

folder2: 20/9/13
2.mkv: 1/1/10

Folder2に「日付を変更」させたい1/1/10

たぶん、このタッチコマンドを https://unix.stackexchange.com/a/1526 から変更すると役に立ちますか?

touch -r **/*(Dom[1]) .

(私はそれが何をするのか理解できません)

以下にいくつかのサンプルパスを示します(もちろんCygwinを使用)。

Kostas@Kostas-pc /cygdrive/f/movies
$ ls -l

drwx------+ 1 Kostas None     0 Feb 18 17:03 Serpico (1973)
drwx------+ 1 Kostas None     0 Feb 21 01:13 The Rite (2011)

例えば

Kostas@Kostas-pc /cygdrive/f/movies
$ ls -l The\ Rite\ \(2011\)/
total 5730596
-rwx------+ 1 Kostas ???????? 5867505504 Apr 27  2011 The Rite (2011).mkv
-rwx------+ 1 Kostas ????????      12968 Feb 16 20:03 The Rite (2011).nfo
-rwx------+ 1 Kostas ????????      79757 Apr 26  2011 The Rite (2011).srt
-rwx------+ 1 Kostas ????????     264745 Oct  8  2011 The Rite (2011).tbn
-rwx------+ 1 Kostas ????????     255667 Oct  8  2011 The Rite (2011)-fanart.jpg
2
darkred

touch-rへの切り替えでは、指定したファイルを、使用するタイムスタンプの参照として使用します。したがって、たとえば:

$ touch -d 2012-01-01 file1
$ ll
total 0
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file1
-rw-rw-r--. 1 saml saml 0 Feb 20 14:37 file2

日付2012-01-01を使用してfile1に日付を設定します。そのファイルのタイムスタンプを使用して、他のファイルやディレクトリを変更できます。

$ touch -r file1 file{2..5}
$ ll
-rw-rw-r--. 1 saml saml    0 Jan  1  2012 file1
-rw-rw-r--. 1 saml saml    0 Jan  1  2012 file2

したがって、-rスイッチを使用して必要な処理を実行できます。

私が次のものを持っていたとしましょう:

$ ll
total 12
drwxrwxr-x. 2 saml saml 4096 Feb 20 14:42 dir1
drwxrwxr-x. 2 saml saml 4096 Feb 20 14:42 dir2
drwxrwxr-x. 2 saml saml 4096 Feb 20 14:42 dir3

$ ll *
dir1:
total 0
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 1.mkv

dir2:
total 0
-rw-rw-r--. 1 saml saml 0 Feb  1  2012 2.mkv

dir3:
total 0
-rw-rw-r--. 1 saml saml 0 Mar  1  2012 3.mkv

このコマンドを実行すると、これらの各ディレクトリに対応する.mkvを取得し、そのタイムスタンプを使用して、各親ディレクトリに適用できます。

$ for i in dir*; do mkv=${i/dir/}.mkv; touch -r "$i/$mkv" "$i" ;done

結果:

$ ll
total 12
drwxrwxr-x. 2 saml saml 4096 Jan  1  2012 dir1
drwxrwxr-x. 2 saml saml 4096 Feb  1  2012 dir2
drwxrwxr-x. 2 saml saml 4096 Mar  1  2012 dir3

編集#1

サンプルのファイル構造に基づいて、次のコマンドを使用します。

$ for i in *;do touch -r "$i/${i}.mkv" "$i";done

$ ll
total 8
drwxrwxr-x. 2 saml saml 4096 Jan  1  2012 Serpico (1960)
drwxrwxr-x. 2 saml saml 4096 Jan  1  2012 The Rite (2011)

$ ll *
Serpico (1960):
total 0
-rw-rw-r--. 1 saml saml 0 Feb 20 18:17 Serpico (1960).mkv

The Rite (2011):
total 0
-rw-rw-r--. 1 saml saml 0 Feb 20 18:17 The Rite (2011).mkv

タイムスタンプを適用

$ for i in *;do touch -r "$i/${i}.mkv" "$i";done
$ ll
total 8
drwxrwxr-x. 2 saml saml 4096 Feb 20 18:17 Serpico (1960)
drwxrwxr-x. 2 saml saml 4096 Feb 20 18:17 The Rite (2011)

このシナリオでは、すべての.mkvファイルは、それらが含まれているディレクトリと同じ名前である必要があります。このスクリプトは、/cygdrive/f/movies/ディレクトリ内で実行します。

3
slm
for dir in /path/dir1 /path/dir2; do
    mkv="${dir}/.mkv"
    if [ -f "$mkv" ]; then
        touch --reference="$mkv" "$dir"
    fi
done
1
Hauke Laging