Вы можете найти inode файла и каталога с помощью опции -i
ls -id /home/user/dir
Вы можете получить информацию о потребляемом inode вашей системы
df -hi
Это в основном то, что написано на крышке, для обоих.
mv
— стандартная утилита для перемещения одного или нескольких файлов в указанную цель. Его можно использовать для переименования файла, если нужно переместить только один файл. Если их несколько,mv
работает, только если целью является каталог, и перемещает туда файлы.
Итак, mv foo bar
либо переместит файл foo
в каталог bar
(, если он существует ), либо переименует foo
в bar
(, если bar
не существует или не является каталог ). mv foo1 foo2 bar
просто переместит оба файла в каталог bar
или пожалуется, если bar
не является каталогом.
mv
вызовет функцию rename()
библиотеки C для перемещения файлов, и если это не сработает (они перемещаются в другую файловую систему ), она скопирует файлы и удалит оригиналы.
Если у вас есть только mv
и вы хотите переименовать несколько файлов, вам придется использовать цикл оболочки. Здесь на сайте есть ряд вопросов по этому поводу, см., например. это , это , и другие .
С другой стороны, различные rename
утилиты переименовывают файлы по отдельности.
rename
из утилиты -linux , которую вы упомянули, делает простую замену строки, например. rename foo bar *
изменит foobar
на barbar
и asdffoo
на asdfbar
. Это не , однако принимает регулярное выражение!
Утилита переименования Perl(или ее различные экземпляры)используют выражение Perl для преобразования имен файлов. Скорее всего, будет использоваться команда s/pattern/replacement/
, где шаблон является регулярным выражением.
И утилита -linux rename, и Perl rename могут использоваться для одновременного перемещения файлов в другой каталог путем внесения соответствующих изменений в имя файла, но это немного неудобно. Ни один из них не делает ничего, кроме вызова rename()
для файлов, поэтому перемещение из одной файловой системы в другую не работает.
Что касается rename
, то это может зависеть от вашего дистрибутива и/или того, что вы установили. Большинство из них поддерживают rename --version
, поэтому используйте его, чтобы определить, какой из них у вас есть.
mv перемещает или переименовывает файлы и каталоги и создает их резервные копии; переименовать просто переименовывает файлы.
mv имеет больше возможностей и опций. Посмотрите на переключатели на справочных страницах для каждого, чтобы увидеть различия в возможностях. Давайте посмотрим, используя man в Ubuntu 18.04LTS (ваш пробег может варьироваться в зависимости от версии каждого пакета):
параметры mv (без справки и версии)
--backup[=CONTROL]
make a backup of each existing destination file
-b like --backup but does not accept an argument
-f, --force
do not prompt before overwriting
-i, --interactive
prompt before overwrite
-n, --no-clobber
do not overwrite an existing file
If you specify more than one of -i, -f, -n, only the final one takes effect.
--strip-trailing-slashes
remove any trailing slashes from each SOURCE argument
-S, --suffix=SUFFIX
override the usual backup suffix
-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
-T, --no-target-directory
treat DEST as a normal file
-u, --update
move only when the SOURCE file is newer than the destination file or when the destination file is missing
-v, --verbose
explain what is being done
-Z, --context
set SELinux security context of destination file to default type
параметры переименования (опуская справку и версию)
-s, --symlink
Do not rename a symlink but its target.
-v, --verbose
Show which files where renamed, if any.
-n, --no-act
Do not make any changes.
-o, --no-overwrite
Do not overwrite existing files.
Это базовая командная строка, предназначенная для выполнения одной задачи и выполнения ее хорошо. (Философия Unix):перемещение файла (s )или каталога (s).
Вы можете взломать STDOUT
и STDIN
¹, чтобы изменить на лету строку назначения, но это просто не умный хак
Существуют другие инструменты с таким же названием, которые могут или не могут сделать это, так что будьте осторожны.
Когда люди говорят о rename
, мы думаем об этом, а не о ELF
, менее мощной (магии? ).
Это не просто, это Perl. Вы можете передать некоторые функции Perl внутрь, и это чрезвычайно мощно.
Рассмотрим этот пример:
Вы хотите переименовать группу файлов, например
foobar_1.txt
foobar_2.txt
foobar_3.txt
Вы можете добавлять нули к цифрам с помощью sprintf()
вот так (с помощью регулярного выражения, хех, это же Perl :D):
rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt
Теперь у вас есть:
foobar_0001.txt
foobar_0002.txt
foobar_0003.txt
Не совсем простая команда, не так ли?
rename на самом деле не предназначен для перемещения каталога (s ), но он может это сделать:
$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file
/tmp/file
¹ какой-то код, который мы видим на *.stackexchange.*
веб-сайтах
for FILE in `ls *.txt`
do
mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done
Это не выход ,это просто глючит, просто чтобы объяснить, почему нужно использовать правильный инструмент в нужный момент
mv
просто меняет имя файла (он также может переместить его в другую файловую систему или путь ). Вы даете ему старое имя и новое имя, и он изменяет файл на новое имя или местоположение.
rename
используется для массового изменения имен.
Допустим, у вас есть тысяча файлов с foo000.log
по foo999.log
, и вы хотите изменить их на bar000.log
–bar999.log
.
С mv
вам придется делать mv foo000.log bar000.log
, mv foo001 bar001.log
и т. д. или же писать скрипт.
С rename
вы просто делаете rename foo bar foo*.log
, и вуаля, тысяча файлов изменяется в одно мгновение! Довольно круто.
Подробнее см. на странице man rename
.