Две вещи можно попробовать:
1) rm -f \\(*
(Вам не нужно -r
если Вы не хотите рекурсивно удалить каталоги. Так как Вы сказали "файлы", я оставил его. rm -rf
опасный инструмент и не должен использоваться, если он не необходим.)
2) комната-i *
Этот метод требует небольшого количества ручного вмешательства, но так как неалфавитно-цифровые символы имеют тенденцию сортировать сначала, вещи, которые Вы хотите удалить, имеют тенденцию подходить сначала, и Вы можете проблема a ^C
когда Вы получили их.
Как примечание, при экспериментировании с нечетными подстановочными знаками, попытка использовать echo
вместо rm
сначала. Особенно при использовании rm -rf
. Тем путем Вы видите то, что оболочка думает, что расширяется до (если что-либо) прежде, чем удалить вещи. Тем более, что иногда этот тип файла создается кем-то надеющимся you'l, делают что-то глупое и сдувают больше файлов, чем, что Вы намереваетесь.
POSIX sh
однострочный:
for file in *.png; do mkdir -p -- "${file%%_*}" && \
mv -- "$file" "${file%%_*}"; done
Объяснение:
.png
в текущем каталоге. mkdir
с префиксом файла; $ {file %% _ *}
удаляет первое подчеркивание и все, что за ним следует; -p
гарантирует, что mkdir
будет тихо, если каталог уже существует. mv
файл в каталог. Согласно приведенному ниже предложению HalosGhost, если желаемая конечная структура -
5830/
1.png
2.png
3.png
5831/
1.png
5832/
1.png
2.png
, приведенный выше однострочный текст можно немного изменить:
for file in *.png; do mkdir -p -- "${file%%_*}" && \
mv -- "${file}" "${file%%_*}/${file##*_}"; done
На этот раз место назначения состоит из каталога $ {file %% _ * }
( $ file
перед подчеркиванием) и новое имя файла $ {file ## * _}
( $ file
после подчеркивания).
Мне несколько раз приходилось делать что-то подобное, чтобы отсортировать кучу файлов. Я обнаружил, что расширение переменной bash - ваш друг.
${parameter%word}
${parameter%%word}
Удалить совпадающий шаблон суффикса. Слово расширяется для создания шаблона так же, как при раскрытии имени пути.
Первоначальная настройка:
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_2.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_3.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5831_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5832_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5832_2.png
$ for i in $(find . -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'./5830_3.png' -> './5830/5830_3.png'
'./5831_1.png' -> './5831/5831_1.png'
'./5830_1.png' -> './5830/5830_1.png'
'./5832_1.png' -> './5832/5832_1.png'
'./5832_2.png' -> './5832/5832_2.png'
'./5830_2.png' -> './5830/5830_2.png'
Вы также можете уточнить, используя '-name * png' или другие флаги в find. Я прогнал это через find с параметром maxdepth, чтобы проверить только указанный каталог. Таким образом, его можно будет запустить снова без изменений, если в этот каталог будут добавлены другие изображения. Я также использовал% вместо %%, чтобы это не сломалось, если вам нужно указать полный каталог, включающий знак подчеркивания, например «/ home / user / my_files / pngs»
$ for i in $(find move_files -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'move_files/5830_3.png' -> 'move_files/5830/5830_3.png'
'move_files/5831_1.png' -> 'move_files/5831/5831_1.png'
'move_files/5830_1.png' -> 'move_files/5830/5830_1.png'
'move_files/5832_1.png' -> 'move_files/5832/5832_1.png'
'move_files/5832_2.png' -> 'move_files/5832/5832_2.png'
'move_files/5830_2.png' -> 'move_files/5830/5830_2.png'