Попытка проанализировать вывод ls
не рекомендуется, даже если используется реализация, которая поддерживает параметры однозначного вывода, такие как -b
или -Q
в версии GNU.
Вместо этого вы должны использовать глобус оболочки для обработки файлов по одному; в Bash мы можем использовать для этого массив:
#!/bin/bash
files=(*)
for i in "${files[@]}"
do
stat --format '%A %U %n' -- "$i"
done
printf "Total number of files: %d\n" ${#files[@]}
Когда вы используете команду mv
, вы просто меняете метаданные о каталоге верхнего уровня или отдельном файле, когда вы используете команду cp
, вы буквально делаете копии отдельного файла или дерева каталогов.. Чтобы различать эти два режима, команда cp
требует, чтобы вы указали, какое поведение вы хотите задействовать.
Вы можете просмотреть метаданные, используя stat
.
$ stat /home/vagrant/adir
File: ‘/home/vagrant/adir’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 794269 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-07-14 10:57:17.103849041 -0400
Modify: 2018-07-14 10:57:17.103849041 -0400
Change: 2018-07-14 10:57:17.103849041 -0400
Birth: -
После того, как мы его переместим:
$ stat /tmp/adir
File: ‘/tmp/adir’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 794269 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-07-14 10:57:17.103849041 -0400
Modify: 2018-07-14 10:57:17.103849041 -0400
Change: 2018-07-14 10:57:53.323950044 -0400
Birth: -
Команда mv
просто манипулирует метаданными, относящимися к каталогу, поэтому для выполнения этой работы не нужно ничего копировать.