Mam kilka folderów i chcę zapętlić wszystkie te foldery iw każdym folderze utwórz inny folder o nazwie „Zdjęcie”
F1
--F11
----F111
----F112
--F12
Chcę mieć:
F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
command-line
mkdir
OOzy Pal
źródło
źródło
ls
nie jest analizowany. To tylko informacja zwrotna dla użytkownika ... pokazująca, co się dzieje. Podobnie jak słowa „To jest katalog zdjęć”. Informuje użytkownika, dlaczego nie tworzy tam katalogu.find -type d F1
, może?$i/Photo
, ale OP nie określił, co należy zrobić w takim przypadku. Nie powiedzie się również w przypadku, co jest mało prawdopodobne, gdy jeden z nich$i
zawiera nowy wiersz.Możesz to osiągnąć za pomocą jednego
find
połączenia.Część
-name 'Photo' -prune -o
mówi, aby nie powracać do istniejących (i nowo utworzonych)Photo
katalogów: Jeśli znaleziony plik (lub katalog) ma nazwęPhoto
, przestań ją przetwarzać (-prune
). W innym przypadku (-o
) przejdź do katalogów (-type d
) i wykonaj (-exec
) polecenie.źródło
-prune
? :) Tak, to jest dość sprzeczne z intuicją, ale warto się uczyć.-type d
razem z-name 'Photo'
wcześniej-prune
.find
będzie kontynuował pracę z innymi folderami (w tym podfolderami tego folderu, jeśli o to poprosisz).Możesz przekazać
find
wynikiwhile
zamiast,for
ponieważ w ten sposób nie zepsuje się, jeśli nazwy plików mają spacjeNajpierw cd do katalogu
F1
, a następnie wykonaj:Jeśli katalog istnieje,
mkdir
po prostu odmówi jego utworzenia, więc nie ma problemu ...Jeśli nazwy katalogów mogą zawierać znaki nowej linii lub inną egzotyczną dziwność, użyj tego, który może poradzić sobie z dowolnymi nazwami:
Dzięki @terdon za pomoc w tym :)
źródło
F1
katalog op jest~user/Pictures
, przejście do katalogu nadrzędnego i uruchomienie wiersza spowoduje umieszczeniePhoto
katalogu w każdym katalogu w jego przestrzeni, który może wynosić tysiące. Zastanów się nad dodaniemF1
jako części linii poleceń, aby uniknąć łatwo popełnionego błędu. W ten sposób, jeśli zostanie przypadkowo uruchomiony z niewłaściwego miejsca, nie utworzy katalogów.F1
zamiast tego, pod redakcją @LDJamesPython z
os.walk
może to zrobić dość łatwo i tylko w kilku wierszach koduWyjaśnienie
Mamy do czynienia z następującą komendą: python -c 'import os; [os.mkdir (r + „/ Pictures”) dla r, d, f w os.walk („.”)]'
Tutaj po prostu wywołujemy interpreter Pythona z
-c
flagą, aby określić polecenie, które wydajemy w ramach pojedynczych cudzysłowów.os.walk()
Funkcja pozwala nam rekurencyjnie przechodzić przez wszystkie podkatalogi, a dla każdego podkatalogu (reprezentowanego przezr
) tworzymy folder Obrazy za pomocąos.mkdir()
funkcji.r+"/Pictures"
jest tylko prostą manipulacją ciągiem, aby połączyć ciąg podkatalogu i ciąg „/ Pictures”, tworząc jedną ścieżkęZamień „/ Pictures” na „/ Photo”, aby spełnić Twoje wymagania
źródło
Jeśli używasz bash, możesz po prostu uruchomić:
Te
globstar
marki opcja**
pasuje „wszystkie pliki i 0 lub więcej katalogów i podkatalogów”. Innymi słowy, dopasowuje wszystko rekurencyjnie. Ze względu/
na koniec**/
pasuje do wszystkich katalogów i podkatalogów (bez plików). Dlatego$d
będą iterować wszystkie katalogi w bieżącym katalogu i ich podkatalogach, aPhotos
katalog zostanie utworzony w każdym z nich.-p
Flagamkdir
środków:Tutaj używam go po prostu do ukrywania komunikatów o błędach, jeśli katalog docelowy już istnieje. Usuń go, jeśli chcesz zobaczyć błędy.
Pamiętaj, że nie uda się utworzyć
Photo
podkatalogu w katalogu docelowym, który zawiera plik o nazwie Zdjęcie. Nie określiłeś jednak, co należy zrobić w tych przypadkach, a wszystkie inne dotychczas opublikowane odpowiedzi również mają to ograniczenie.źródło