У меня есть несколько файлов в одной папке:
ABA.xy
BEB.xy
ACA.xy
Те же файлы с разным расширением в другой папке
ABA.rr
BEB.rr
ACA.rr
Затем у меня есть одна папка для каждого имени файла [ ! d2]
ABA
BEB
ACA
Я хотел бы сделать следующее. если файл с расширением .xy и .rr имеет то же имя, что и папка, перейдите в эту папку. Например,
ABA.xy and ABA.rr in ABA
Я знаком с mv, но я думаю, что здесь я должен написать небольшой скрипт для этого.
Немного другой подход с использованием rename:
rename 's#.*/(.+)(\.\w+)#mkdir "dest/$1"; "dest/$1/$1$2"#e' source/{a,b}/*
Это по существу просто использование регулярного выражения для перевода путей. Мы используем немного Perl (который поддерживает rename) для создания новых каталогов, и переименование перемещает файл в конце.
Это не слишком умно. Он не будет искать случаи, когда нет соответствующего файла (мы могли бы искать и удалять каталоги только с одним файлом), и он, вероятно, взорвется, если есть файлы без расширений.
$ mkdir -p source/{a,b} dest
$ touch source/a/{ABA,BEB,ACA}.xy
$ touch source/b/{ABA,BEB,ACA}.rr
$ tree
.
├── dest
└── source
├── a
│ ├── ABA.xy
│ ├── ACA.xy
│ └── BEB.xy
└── b
├── ABA.rr
├── ACA.rr
└── BEB.rr
$ rename 's#.*/(.+)(\.\w+)#mkdir "dest/$1"; "dest/$1/$1$2"#e' source/{a,b}/*
$ tree
.
├── dest
│ ├── ABA
│ │ ├── ABA.rr
│ │ └── ABA.xy
│ ├── ACA
│ │ ├── ACA.rr
│ │ └── ACA.xy
│ └── BEB
│ ├── BEB.rr
│ └── BEB.xy
└── source
├── a
└── b