Tuhaf mv operasyonu


2

Bir yeniden adlandırma programının kullanılması, bazı dosyalarımı ciddi şekilde bozdu. Onları sırayla geri almaya çalışıyorum.

Bunun gibi bir dosya yapısına sahibim:

./Hello World/some-filename.ext
./Kitty Parade/another.ext
./Third Example/abc.ext
./some-filename.ext2
./another.ext2
./abc.ext2

Amaç, geçerli klasördeki (./) dosyaları orijinal klasörlerine geri taşımaktır.

Örneğin:
another.ext2aittir ./Kitty Parade/klasör
some-filename.ext2aittir ./Hello World/klasörde
abc.ex2aittir ./Third Example/folder`

Kural şu ​​şekilde tanımlanabilir: Geçerli klasörde ( ./) bir dosya varsa , aynı dosya adına sahip (ancak farklı uzantılara sahip) bir dosya içeren bir klasör bulun ve bu klasöre taşıyın. Not: ./myFilenameBu dosya arasında güvenilir bir ilişki yoktur ./originalFolderName.

Bu 4,000'den fazla dosya oldu, aksi halde el ile yapardım. Herhangi bir olası yardım?

Yanıtlar:


5

Bu kabuk büyüsünü dene:

for i in *.*; do
  BASE=$(basename "$i" .ext2)
  LIST=*/"${BASE}".*
  DIR=$(dirname "${LIST}")
  mv -n "$i" "${DIR}"
done

Veya bir oneliner olarak:

for i in *.*; do mv -n "$i" "$(dirname */"$(basename "$i" .ext2)".*)"; done

Önce:

whitequark@forth:~/test$ ls *
test 1.ext2  test 2.ext2  test 3.ext2

f 1:
test 1.ext

f 2:
test 2.ext  test 3.ext

Sonra:

whitequark@forth:~/test$ ls *
f 1:
test 1.ext  test 1.ext2

f 2:
test 2.ext  test 2.ext2  test 3.ext  test 3.ext2

-nAnahtar şey yazmasını koruyacaktır.


ls */"${BASE}".*heh, güzel Daima bunun için bulmuş olabilir.
skarface

lsgerekli değildir: LIST=*/"${BASE}".*ve `" $ (dirname " /" $ (temel ad "$ i" .ext2) ". ") "
Dennis Williamson

@Dennis: teşekkürler, değişti. Bu önceki komut versiyonundan kaldı.
whitequark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.