Групповые файлы в некоторых папках

Chromium Wheel Smooth Scroller

В Chrome это Soluttion: https://chrome.google.com/webstore/detail/chromium-wheel-smooth-scr/khpcanbeojalbkpgpmjpdkjnkfcgfkhb

Просто великолепно!

1
задан 5 January 2016 в 04:09

4 ответа

Вы можете использовать find с несколько сложной командой exec:

find . -iname '*?.?*' -type f -exec bash -c 'EXT="${0##*.}"; mkdir -p "$PWD/${EXT}_dir"; cp --target-directory="$PWD/${EXT}_dir" "$0"' {} \;

# '*?.?*' requires at least one character before and after the '.', 
# so that files like .bashrc and blah. are avoided.
# EXT="${0##*.}" - get the extension
# mkdir -p $PWD/${EXT}_dir - make the folder, ignore if it exists

Заменить cp на echo для сухого хода.

Более эффективным и более аккуратным было бы сохранить команду bash в скрипте (например, в /path/to/the/script.sh):

#! /bin/bash

for i
do
    EXT="${i##*.}" 
    mkdir -p "$PWD/${EXT}_dir"
    mv --target-directory="$PWD/${EXT}_dir" "$i" 
done

И затем запустите find: [!d4 ]

find . -iname '*?.?*' -type f -exec /path/to/the/script.sh {} +

Этот подход довольно гибкий. Например, чтобы использовать имя файла вместо расширения (filename.ext), мы использовали бы это для EXT:

NAME="${i##*/}"
EXT="${NAME%.*}"
13
ответ дан 24 May 2018 в 04:15
  • 1
    +1; -iname '*.*' должен позаботиться об угловых случаях, о которых я беспокоился ... хорошая идея! – Rmano 27 August 2014 в 14:53
  • 2
    @Rmano не для *.fig.bak или .profile/.bashrc, но он должен обрабатывать файлы с расширениями, по крайней мере. Благодарю. – muru 27 August 2014 в 14:55
ls | gawk -F. 'NF>1 {f= $NF "-DIR"; system("mkdir -p " f ";mv " $0 " " f)}'

Вычисление списка расширений (после перемещения):

ls -d *-DIR

Вычисление списка расширений (перед перемещением):

ls -X | grep -Po '(?<=\.)(\w+)$'| uniq -c | sort -n

(в этом последнем пример, мы вычисляем количество файлов для каждого расширения и сортируем его)

6
ответ дан 24 May 2018 в 04:15
  • 1
    извините: опечатка "mkdir -f" был скорректирован на "mkdir -p" (чтобы игнорировать, если dir уже существует) – JJoao 29 December 2014 в 20:32
  • 2
    Не следует ли применять uniq после сортировки? И, пожалуйста, не разбирайте вывод ls. – muru 31 December 2014 в 02:21
  • 3
    @muru, (часть 1) ls -X гарантирует, что расширения сортируются. Конечным типом было просто заказать таблицу расширений по количеству вхождений - релевантность. (Я прав?). – JJoao 31 December 2014 в 03:32
  • 4
    @muru, (часть 2) ls -X | grep -Po '(?<=\.)(\w+)$' была моей первой идеей получить отсортированный список расширений. Это очень плохо? Что ты предлагаешь? – JJoao 31 December 2014 в 03:35
  • 5
    Я забыл, что делает ls -X. Что касается того, почему я рекомендую против ls, см. unix.stackexchange.com/q/128985/70524 и unix.stackexchange.com/q/112125/70524 . Чтобы достичь того, что вы делаете, я бы сделал более длинный путь: find . -type f -name '*?.?*' -print0 | sed -z 's/.*\.//' | sort -zu (с дополнительным | uniq -cz, если необходимо количество). И find ... -print0 | gawk -v RS='\0' (хотя это не очень портативный ) для первого. – muru 31 December 2014 в 06:06

Попробуйте этот сценарий оболочки.

#!/bin/sh
src=`dirname "$1"`/`basename "$1"`;
for file in "$src"/*?.?*; do
  if test -f "$file"; then
    dest="$src${file##*.}"_files;
    mkdir -p "$dest";
    mv "$file" "$dest";
  fi;
done;

# pass the directory to re-organize as first argument
# moves only regular files which have extension
# ignores other type of files including
# files having no extension, hidden files, directories, and links.
5
ответ дан 24 May 2018 в 04:15
  • 1
    Прошу прощения, это ошибка. Я должен был бы заменить каждое вхождение filepath на file. Я исправлю это напрямую. – Prashant Karmakar 29 December 2014 в 20:35
  • 2
    Не разбирайте вывод ls. Вместо этого сделайте for file in "$src"/*?.?*; do .. – muru 31 December 2014 в 02:22
  • 3
    @muru будет работать правильно, если имя какого-либо файла имеет пробелы? – Prashant Karmakar 31 December 2014 в 10:10
  • 4
    @PrashantKarmakar да, тогда как read может иметь неожиданное поведение. Вы также должны указывать переменные в командах mkdir и mv. – muru 31 December 2014 в 10:12
  • 5
    Проверьте это, если вы: for i in *; do printf "%s\n" "$i"; done; for i in $(ls -d); do printf "%s\n" "$i"; done – muru 31 December 2014 в 10:14

Если у вас установлено имя переименования Perl / prename:

rename 's!(.*)\.(\w+)$! mkdir($2); "$2/$&"!ge'  *
2
ответ дан 24 May 2018 в 04:15

Другие вопросы по тегам:

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