Como alterar “data de modificação” de várias pastas, para ser o mesmo de um .mkv dentro de cada uma, usando o Cygwin

2

Como alterar "data de modificação" de várias pastas para ser o mesmo do .mkv que está dentro de cada um.

por exemplo. há folder1 que contém um arquivo 1.mkv

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

Eu quero que a pasta1 receba "data de modificação" em 1/6/12

também há

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

Eu quero que a folder2 receba "data de modificação" em 1/1/10

etc

Talvez alguma modificação desse comando por toque link ajudaria?

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

(não consigo entender o que faz)

Aqui estão alguns exemplos de caminhos (usando o Cygwin, é claro):

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)

por exemplo

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
    
por darkred 20.02.2014 / 20:22

2 respostas

3

A mudança para touch , -r usa qualquer arquivo fornecido como referência para o timestamp a ser usado. Então, por exemplo:

$ 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

Irá definir a data em file1 usando a data de 2012-01-01. Eu posso usar o timestamp do arquivo para alterar outros arquivos & diretórios.

$ 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

Você pode utilizar a opção -r para fazer o que quiser.

Exemplo

Digamos que eu tenha o seguinte:

$ 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

Agora, se executarmos este comando, podemos obter o .mkv correspondente para cada um desses diretórios e usá-lo, aplicando-o a cada diretório pai.

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

Os resultados:

$ 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

EDIT # 1

Com base na sua estrutura de arquivos de exemplo, use o seguinte comando:

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

Exemplo

$ 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

aplicar registros de data e hora

$ 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)

Nesse cenário, todos os arquivos .mkv precisariam ter um nome idêntico ao diretório em que estão inseridos. Você executaria esse script enquanto estivesse dentro do diretório /cygdrive/f/movies/ .

    
por 20.02.2014 / 20:48
1
for dir in /path/dir1 /path/dir2; do
    mkv="${dir}/.mkv"
    if [ -f "$mkv" ]; then
        touch --reference="$mkv" "$dir"
    fi
done
    
por 20.02.2014 / 20:38