Przepraszam, że to wydaje się takie głupie pytanie, ale nie mogę sobie pozwolić na spieprzenie go.
Mam kilka takich folderów:
/ users / me / foo / oops1
/ users / me / foo / oops2
/ users / me / foo / oops3
/ users / me / foo / oops4
/ users / me / foo / bar
Niestety, nie są one tak nazwane w jednolity sposób i istnieją setki folderów ups.
Zamierzałem skopiować wszystkie foldery oops do paska. Czy istnieje prosty sposób na przeniesienie wszystkich folderów Oops do paska, który nie spowoduje problemów z przenoszeniem rekurencyjnym?
Skopiowanie plików zajęło kilka godzin. Mam nadzieję, że ruch będzie znacznie szybszy.
Nawiasem mówiąc, jest to na serwerze Linux Redhat. Mam tylko dostęp ssh.
Myślę, że jeśli to zrobię
cd foo
mv * bar
będzie problem.
linux
file-transfer
bash-scripting
jgritty
źródło
źródło
Odpowiedzi:
Niestety, zarówno odpowiedź Matta, jak i Nicole wykazuje zły styl i ulegnie zepsuciu, jeśli którykolwiek z folderów będzie zawierał pojedynczy znak spacji, znak globowania (podobny
*
) lub nową linię. Bieganiefor item in $(ls …)
jest ogromnym błędem, który można popełnić, ponieważ prędzej czy później ugryzie ich, a iteracja nazw plików, niepoprawne ich wyświetlanie może powodować różnego rodzaju problemy.Nigdy nie analizuj wyniku
ls
.W Linuksie jest narzędzie do wyszukiwania plików spełniających określone kryteria i nazywa się
find
:Pozwoli to przenieść żadnych katalogów w bieżącym katalogu roboczym, które nie są nazywane
bar
w./bar/
. Będzie działać, nawet jeśli nazwy katalogów zawierają spacje, znaki globowania lub znaki nowej linii.Wyrażenie regularne
.\/bar$
będzie pasować tylko do nazwanego katalogu./bar
i jest negowane przez!
.źródło
mv
raz dla każdego pliku. Przy tak wielu terminach daje wiele możliwości popełnienia błędu.bash
potrzebuje lepszego narzędzia do zastępowania, które poradzi sobie z nazwami plików ze spacjami.mv
raz dla każdego folderu , a nie pliku. Uważam, że dzięki\+
temu powinien działać szybciej i przenosić wszystkie foldery za pomocą jednego polecenia, chociaż nie wiem, czy spowodowałoby to znaczne przyspieszenie. Zgadzam się z tobą, że powinno to być znacznie łatwiejsze, ponieważ w przypadku plików w Bash najprostszy sposób robienia rzeczy nigdy nie jest właściwy, niestety. Po prostu czułem, że potrzebna jest odpowiedź, która i tak zadziała.To, co proponujesz, jest dokładnie właściwe.
mv
jest wystarczająco mądry i powie:Jednak wszystkie katalogi oopsx będą znajdować się w pasku.
źródło
Tak, masz rację, to byłby problem, ponieważ
*
również pasujebar
; nie możeszmv
katalogować w sobie.Technicznym sposobem jest użycie podstawiania poleceń i pętli
mv
tylko do rzeczy, które nie sąbar
. Na przykład,bash
możesz napisać coś takiego, ale zwróć uwagę, że nie powiedzie się, jeśli trafi na nazwę zawierającą spację (ponieważ podstawianie poleceń rozbija rzeczy na słowa w spacjach).Ale szczerze mówiąc, jestem leniwy. Chciałbym
mv
bar z drogi, a potemmv
wszystko do niego, a następnie przenieść go z powrotem. Przenosisz tylko łącza do systemu plików, a nie zawartość pliku, więc jest szybki. Ma to tę zaletę, że działa, jeśli masz nazwy ze spacjami.źródło
"foo baz"
będzie wyglądał jakmv foo baz bar
, a następnie zawiedzie.bash
który powinien zostać naprawiony (jest naprawiony w mojej powłoce C ), (c) jest to dobry powód, aby to zrobić drugi sposób, który tak naprawdę poleciłem.*
to pasujebar
, nie stanowi problemu, ponieważ „mv” / jądro jest wystarczająco inteligentne, aby wykryć to wystąpienie. Zamiast więc stwierdzać, że jest to problem, jest to dobry sposób na zrobienie tego (chyba że chcesz odfiltrować niektóre katalogi, ale to inne pytanie)Jeśli czujesz się bezpieczniej, możesz to zrobić w BASH:
źródło
grep -v '^bar$'
do dopasowania „paska”.ls -d
daje tylko.
bieżący katalog roboczy. Jesteś pewien, że to działa? Próbowałeś już polecenia? Zobacz: Jak wyświetlić listę folderów za pomocą poleceń bash? - ponadto skrypt nie powiedzie się, jeśli którykolwiek z katalogów zawiera spację, znak nowej linii lub znak globowania w nazwie.cd do foo
bardziej ogólnych
źródło