Przenieś zakres ponumerowanych plików?

14

Mam 291 ponumerowanych plików (zaczynających się od 001 - tytuł i kończących się na 291 - tytuł), które wymagają przeniesienia do oddzielnych katalogów. (Od 001 do 021 do folderu 1, od 022 do 053 do folderu 2, niekoniecznie jest to ta sama liczba plików za każdym razem).

Uznałem, że mógłbym to zrobić w tak szczęsliwy sposób: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Jestem prawie pewien, że jest lepszy sposób, więc co by to było?

EDYCJA: Więc to by działało dobrze, ale przypomniałem sobie ...

Nie utknąłem przy użyciu terminala, więc użyłem menedżera plików do klikania i przeciągania. Pytanie wciąż pozostaje aktualne.

Obrabować
źródło
1
Chcesz 21 podfolderów w folderze 1 i 22 folderów w folderze 2?
Daniel Beck
Czy sprawdziłeś już unix.SE? Jest tutaj dobry wątek: unix.stackexchange.com/questions/12976/…
chrisjlee
@DanielBeck nie, chcę, aby pliki były przenoszone do każdego folderu. W każdym folderze jest inna liczba plików.
Rob
@ ChrisJ.Lee To bardzo podobne do tego, co robiłem / robiłem wcześniej, podoba mi się. Ponieważ pliki pasują do innych plików w innym folderze, mogłem ls -l | grep ^- | wc -luzyskać liczbę wierszy.
Rob
1
@Rob Right. Mimo to różna liczba plików w każdym katalogu. Automatyzacja tego (w tym reguł) jest większym wysiłkiem niż samodzielne wykonanie tego kilka razy.
Daniel Beck

Odpowiedzi:

25

Ponieważ powiedziałeś, że nie zawsze jest to dokładnie 21 plików, niż musisz przenieść pliki ręcznie, a aby to zrobić skutecznie, możesz użyć rozszerzenia nawiasów klamrowych :

mv filename{001..21} dir1
mv filename{022..53} dir2
...
drrlvn
źródło
Wygląda na to, że może działać, wypróbuję to.
Rob
1
Działa to doskonale, jeśli dodasz symbol wieloznaczny po nawiasach. Właśnie tego potrzebowałem.
Rob
2
Jeśli liczba znajduje się w środku nazwy, możesz pisać file{001..21}name, nie musisz używać symboli wieloznacznych. Tak czy inaczej, cieszę się, że ci się udało.
drrlvn,
1

Spowoduje to przeniesienie plików zgodnie z opisem (oprócz tego, że drugi zakres będzie wynosił od 022 do 042 dla drugich 21 plików).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done
Wstrzymano do odwołania.
źródło
Nie zawsze jest to 21 plików, ale dzięki.
Rob
0

Chodzi mi o to, aby przenieść wiele plików (na przykład dziesięć tysięcy lub milion), shell będzie narzekał na listę plików zbyt długo, jeśli użyjesz {1..20}, więc

W Zsh możesz załadować wbudowane mv :

setopt Extended_glob zmodload

zsh / files

po wykonaniu tej czynności możesz użyć polecenia:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

lub jeśli piszesz jakieś skrypty powłoki, możesz zrobić coś takiego:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

jeśli nie używasz zsh, możesz odnieść się do /unix/128559/solving-mv-argument-list-too-long

Arron Cao
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. Którą odpowiedź określasz jako „bardziej szczegółową odpowiedź”?
Ramhound,
To tak naprawdę nie odpowiada na pytanie, ponieważ OP chce przenieść różne pliki do różnych katalogów.
DavidPostill