Файлы вида в каталоги называет префикс файла

Две вещи можно попробовать:

1) rm -f \\(*

(Вам не нужно -r если Вы не хотите рекурсивно удалить каталоги. Так как Вы сказали "файлы", я оставил его. rm -rf опасный инструмент и не должен использоваться, если он не необходим.)

2) комната-i *

Этот метод требует небольшого количества ручного вмешательства, но так как неалфавитно-цифровые символы имеют тенденцию сортировать сначала, вещи, которые Вы хотите удалить, имеют тенденцию подходить сначала, и Вы можете проблема a ^C когда Вы получили их.

Как примечание, при экспериментировании с нечетными подстановочными знаками, попытка использовать echo вместо rm сначала. Особенно при использовании rm -rf. Тем путем Вы видите то, что оболочка думает, что расширяется до (если что-либо) прежде, чем удалить вещи. Тем более, что иногда этот тип файла создается кем-то надеющимся you'l, делают что-то глупое и сдувают больше файлов, чем, что Вы намереваетесь.

2
05.06.2014, 23:00
2 ответа

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 после подчеркивания).

8
27.01.2020, 21:51

Мне несколько раз приходилось делать что-то подобное, чтобы отсортировать кучу файлов. Я обнаружил, что расширение переменной 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'
0
27.01.2020, 21:51

Теги

Похожие вопросы