Czy można zmienić nazwę pliku lub katalogu za pomocą i-węzła?


Odpowiedzi:


6

Możesz zmienić nazwę pliku (katalogu lub cokolwiek), korzystając tylko ze znajomości i-węzła find, ale jeśli (a) system plików zawierający go nie jest zamontowany lub jeśli (b) istnieje inny system plików zamontowany w niepustym katalogu, który zawiera interesujący cię plik, plik po prostu nie jest dostępny dla twojego systemu. W przypadku (a) musisz zamontować system plików, zanim będziesz mógł cokolwiek zrobić z zawartością, w tym zmienić jego nazwę, aw przypadku (b) musisz odmontować system plików, który jest zamontowany „nad” katalogiem zawierającym plik, którego nazwę chcesz zmienić. Wygląda na to, że pytasz o przypadek (b).

Jeśli dobrze cię rozumiem, starasz się, aby twój stary /homekatalog (który znajduje się na głównej partycji) był dostępny, wciąż korzystając z nowej partycji zamontowanej na /home. Jeśli tego chcesz, wykonaj następujące czynności:

Zamknij wszystkie pliki i wyloguj się. Następnie zaloguj się jako root(użyj do tego wirtualnego terminala - naciśnij Ctrl-Alt-F2) Uruchom następujące polecenie:

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old

Jeśli wszystko jest w porządku, wyloguj się i zaloguj ponownie jako Ty i wszystko powinno być w porządku.

Nawiasem mówiąc, polecenie zmiany nazwy pliku przy użyciu tylko wiedzy o jego i-węźle (zakładając, że plik znajduje się w bieżącym katalogu) to:

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;

Gdzie 123456789oczywiście jest numer i-węzła. (Zauważ, że findokreśla nazwę pliku i jego ścieżkę i przekazuje te informacje do mv; nie ma żadnego sposobu, aby zmienić nazwę pliku bez angażowania istniejącej nazwy pliku w jakikolwiek sposób, ale jeśli tylko nie znasz nazwy pliku, jest to dość prosty.)


Czy komenda mv może zmienić nazwę bezpośrednio na podstawie i-węzła? Zakładam, że polecenie find zwraca nazwę pliku w normalnej formie tekstowej.
vfclists

@vfclists: Nie, mvw żaden sposób nie zaakceptuje i-węzłów.
Wildcard

6

W typowym systemie plików Uniksa przeniesienie pliku na podstawie i-węzła jest zasadniczo niemożliwe. Powodem jest to, że zmiana nazwy pliku oznacza usunięcie wpisu katalogu z katalogu, który go zawiera, i utworzenie katalogu w innym miejscu. Ale i-węzeł nie zawiera wskaźnika do pozycji katalogu, zawiera tylko (wskaźniki) metadane pliku (znaczniki czasu, uprawnienia itp.) I zawartość pliku.

W przypadku pliku z wieloma dowiązaniami stałymi, którego z nich chciałbyś zmienić? I-węzeł to za mało informacji.

W przypadku katalogu, w niektórych systemach plików, możliwe byłoby działanie z uwzględnieniem samego i-węzła:

  1. Przeczytaj zawartość katalogu, który jest zdecydowanie dostępny z i-węzła.
  2. Znajdź pozycję katalogu dla ... To wskazuje na katalog nadrzędny.
  3. W katalogu nadrzędnym wyszukaj pozycję katalogu z odpowiednim numerem i-węzła.

Rodzi to jednak kilka założeń:

  • Co jeśli istnieje wiele wpisów dla tego samego i-węzła? W rzeczywistości nie stanowi to problemu: w praktyce tak się nie stanie, ponieważ większość wariantów uniksowych zabrania wyraźnych twardych linków do katalogów.
  • Czy ..w ogóle istnieje? Zależy to od typu systemu plików. Niektóre systemy plików mają wyraźny wpis ..; dla innych wpisy te sfałszowane są przez sterownik systemu plików. Jeśli ..nie istnieje, takie podejście jest zasadniczo niemożliwe.
  • Nawet jeśli system plików zawiera ..łącza, istnieje jeszcze jedna przeszkoda, która może nie być oczywista: krok 1 może być możliwy w jądrze, ale nie ma dla niego interfejsu. Wiele wariantów uniksowych nie ma interfejsu, który umożliwia otwieranie pliku za pomocą jego i-węzła, ponieważ pomija to uprawnienia. Na przykład plik z uprawnieniami rwxr-xr-x(tj. Do odczytu na świecie), który znajduje się w katalogu z uprawnieniami rwx------(tj. Dostępny tylko dla jego właściciela), nie jest dostępny dla nikogo oprócz właściciela katalogu. Nie można tego ustalić na podstawie samego i-węzła - plik może być faktycznie dostępny za pośrednictwem innego twardego łącza!

Rezultatem jest to, że nie, nie można nic zrobić, w tym zmienić nazwy, z plikiem, który ma tylko swój i-węzeł. Musisz mieć ścieżkę do pliku.

Jedynym praktycznym sposobem działania na pliku, biorąc pod uwagę jego i-węzeł, jest najpierw znalezienie ścieżki, na przykład za pomocą find -inum, a następnie użycie ścieżki do działania. Nie pomaga to w sytuacji, gdy plik jest zacieniony przez punkt montowania. Nie ma przenośnego sposobu na dostęp do plików zacieniowanych przez punkt montowania; w Linuksie, jak odkryłeś, możesz użyć wiązania bind.


-1

Dziękuję Ci. To było najbardziej pomocne. Pozwala mi to na zmianę nieporęcznych nazw transkrypcji plików wideo pobranych z YouTube na bardziej zwięzłe, ale wciąż znaczące nazwy plików. Na przykład:

you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs

... daje mi pliki:

20191129_tucker.webm; oraz „Saving Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 29 listopada 2019.en.srt”

Uważam to za wadę bardzo przydatnego skądinąd.

Mogę zmienić nazwę drugiego pliku w następujący sposób:

$ ls -il "Saving Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 29 listopada 2019.en.srt"

... daje mi to listę plików wraz z numerem i-węzła na samym początku:

13902671 -rw-r - r-- 1 James James 55793998 30 listopada 18:44 Saving Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News 29 listopada 2019.en.srt

... wtedy biegam:

mvi 13902671 20191129_tucker.srt

Mój skrypt powłoki mvi bash to:

#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;

Nie dodaje to żadnych nowych informacji poza to, co wcześniej wspomniano. Ponadto mviskrypt używa zmiennych niecytowanych, co oznacza, że ​​zakończy się niepowodzeniem, jeśli którykolwiek z argumentów podanych w skrypcie zawiera znaki spacji (lub potencjalnie również wtedy, gdy zawierają znaki globowania).
Kusalananda
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.