Если это должен быть сценарий оболочки, он немного грязный. Если это может быть скрипт, запускаемый из оболочки, тогда Perl или Python могут лучше служить вашим целям.
Ответ пара 2
Эти ответы создают каталоги, найденные в некотором удаленном каталоге в текущем рабочем каталоге. Это то, что требует вопрос.
Shell
Предполагая GNU find
и xargs
; POSIX find
не поддерживает -print0
или -printf
, а также POSIX xargs
не поддерживает -0
.
(cd "/media/New\ Volume/bhajans"; find . -maxdepth 1 -type d -print0) |
xargs -0 mkdir -p
Это гарантирует, что имена, перечисленные в find
, настолько просты, насколько это возможно (./name1
и т. Д.), Но вывод включает в себя .
и mkdir .
не удается, поскольку каталог существует. Использование mkdir -p
останавливает это как ошибку.
Обратите внимание, что -print0
сильно отличается от -print 0
. Первая - это специальная команда, вариант команды -print
для find
. Вместо завершения имени пробелом или новой строки, оно завершает его с помощью ASCII NUL. Это умное расширение от GNU. Есть только два символа из 256 возможностей, которые не могут отображаться в имени файла в каталоге. Одним из них является /
, потому что он используется в качестве разделителя пути; другой - ASCII NUL. Завершая имена с помощью ASCII NUL (называемого '\0'
в коде C; у него нулевое значение байта), имена однозначно отделяются друг от друга. Это, однако, требует программ, которые ожидают, что эта конвенция будет работать; Например, xargs
пришлось изменить, чтобы его можно было распознать.
Когда вы написали -print 0
, вы сказали find
напечатать имена, а затем добавили еще один каталог (названный 0
) в список, который он должен был искать, и он возразил против этого.
Когда вы писали -printf 0
, вы говорили find находить для печати по одному 0
каждый раз, когда он находил файл, так оно и было. Он не добавлял символы новой строки или пробелы (вы не просили об этом), поэтому xargs
увидел строку, содержащую 00000000
, а затем создал ее как подкаталог, в точности так, как вы его просили.
* * Perl тысяча сорок-девять
Это становится, во всяком случае, немного легче:
use strict;
use warnings;
my $otherdir = $ARGV[0];
die "$otherdir is not a directory" unless -d $otherdir;
opendir(my $dir, $otherdir) or die "failed to open directory $otherdir";
while (my $name = readdir($dir))
{
next if $name eq "." || $name eq "..";
mkdir $name if (-d $file);
}
closedir($dir);
Это просто читает имена из удаленного каталога и создает эти каталоги в текущем каталоге.
Ответ пара 1
Эти ответы создают каталоги, найденные в текущем рабочем каталоге в некотором удаленном каталоге. Это обратный вопрос (но так я бы все делал автоматически).
Shell
Предполагая GNU find
и xargs
; POSIX find
не поддерживает -print0
или -printf
, а также POSIX xargs
не поддерживает -0
.
find . -maxdepth 1 -type d -print0 |
(cd /SomeWhere/Else; xargs -0 mkdir)
Perl
use strict;
use warnings;
my $otherdir = $ARGV[0];
die "$otherdir is not a directory" unless -d $otherdir;
opendir(my $dir, ".") or die "failed to open current directory";
while (my $name = readdir($dir))
{
mkdir "$otherdir/$name" if (-d $file);
}
closedir($dir);
Официально не проверено.