Я пытаюсь массово переименовать некоторые файлы, обрезая файлы, в которых первое место происходит в имени файла. Я написал простой скрипт, чтобы сделать это с помощью переименования, как, например:/usr/bin/rename: слишком длинный список аргументов (массовое переименование файлов)
for i in *.fa; do rename 's/\s.*//' *.fa; done
Это прекрасно работает в тесте и дает следующие результаты, как желательные:
$:~/testenv$ ls
NM_000016.5_LastMex1_4_12 23 0 1 KB882088_3062975-30.fa NM_000016.5_PastMex1_4_12 23 0 1 KB882088_3062975-30.fa
$:~/testenv$ for i in *.fa; do rename 's/\s.*//' *.fa; done
$:~/testenv$ ls
NM_000016.5_LastMex1_4_12 NM_000016.5_PastMex1_4_12
К сожалению, я должен сделать это много файлов, около 6,7 миллионов. Это дает мне следующее сообщение об ошибке:
/usr/bin/rename: Argument list too long
Я пытался всякого рода трюк я могу думать, даже когда я использую его найти не могу подобрать файлы.
$:~/testenv$ ls
NM_000016.5_astMex1_4_12 23 0 1 KB882088_3062975-30.fa NM_000016.5_PastMex1_4_12 23 0 1 KB882088_3062975-30.fa
NM_000016.5_LastMex1_4_12 23 0 1 KB882088_3062975-30.fa
$:~/testenv$ find . -maxdepth 1 -type f -exec sh -c 'rename 's/\s.*//' *.fa' _ {} \;
find: `./NM_000016.5_PastMex1_4_12 23 0 1 KB882088_3062975-30.fa': No such file or directory
find: `./NM_000016.5_astMex1_4_12 23 0 1 KB882088_3062975-30.fa': No such file or directory
Любая помощь была бы принята с благодарностью.
'для г в * .fa; do rename 's/\ s. * //' * .fa; done', когда он работает, переименовывает все ваши .fa-файлы * один раз для каждого файла *, то есть, если у вас 1000 файлов, вы переименовываете все 1000 файлов в 1000 раз, в общей сложности 1,000,000 потенциальных операций. Наверняка, это не то, что вы хотите. –
Эти примеры 'ls' будут легче читать, если их заменить примерами' ls -1Q'. ('-1Q' перечисляет по одному элементу в строке, * цитируется *.) – agc
@agc, ... хотя это расширение не-POSIX, нет гарантии, что OP (или кто-либо еще) имеет его доступным. –