Odpowiedzi:
Z katalogu powyżej F1 uruchom ten skrypt:
Celem skryptu jest uniknięcie tworzenia zbędnych katalogów zdjęć w katalogach zdjęć.
Ponadto jest zaprojektowany tak, aby zapobiec przypadkowemu uruchomieniu go z niewłaściwej lokalizacji, takiej jak katalog główny użytkownika, podczas gdy nie zobaczyłby F1
katalogu i błędnie utworzyłby setki katalogów zdjęć w niewłaściwych pałacach.
Ponadto moim zamiarem było stworzenie łatwego do śledzenia skryptu, aby użytkownik mógł go dostosować.
#!/bin/bash
while IFS= read -r -d '' i;
do
if [[ ! -d $i/Photo ]]; then
# Filter to skip folders named Photo
thisfolder="$(echo $i | sed "s/.*\///")"
if [[ ! $thisfolder == "Photo" ]]; then
mkdir "$i/Photo"
fi
fi
done < <(find F1 -type d -print0)
Skrypt zaktualizowany:
p
w photo
na wielkie litery.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.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
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.
-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
wyniki while
zamiast, for
ponieważ w ten sposób nie zepsuje się, jeśli nazwy plików mają spacje
Najpierw cd do katalogu F1
, a następnie wykonaj:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
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:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Dzięki @terdon za pomoc w tym :)
F1
katalog op jest ~user/Pictures
, przejście do katalogu nadrzędnego i uruchomienie wiersza spowoduje umieszczenie Photo
katalogu w każdym katalogu w jego przestrzeni, który może wynosić tysiące. Zastanów się nad dodaniem F1
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ą @LDJames
Python z os.walk
może to zrobić dość łatwo i tylko w kilku wierszach kodu
$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'
$ tree
.
├── dir_one
│ └── Pictures
├── dir_two
│ ├── dir_three
│ │ └── Pictures
│ └── Pictures
└── Pictures
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 przez r
) 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
Jeśli używasz bash, możesz po prostu uruchomić:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
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, a Photos
katalog zostanie utworzony w każdym z nich.
-p
Flaga mkdir
środków:
-p, --parents
no error if existing, make parent directories as needed
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.