Рекурсивное копирование и переименование файлов с использованием части имени папки для нового имени

1. usbtop:

Как указывает sebas ,usbtopкажется, дает определенный минимальный уровень полезной информации (, хотя мог бы быть намного лучше ), поэтому я рекомендую его.

enter image description here

Вот как это установить:

  1. Клонировать репозиторий git:

    git clone https://github.com/aguinet/usbtop.git 
    
  2. Перейдите в каталог, который только что был создан изgit clone:

    cd usbtop
    
  3. Установить зависимости:

    sudo apt update 
    sudo apt install libboost-dev libpcap-dev libboost-thread-dev libboost-system-dev cmake
    
  4. Создайте локальный каталог сборки и перейдите в него:

    mkdir _build && cd _build 
    
  5. Запустите cmake, чтобы подготовиться к сборке usbtop из исходников:

    cmake -DCMAKE_BUILD_TYPE=Release.. 
    
  6. Собрать usbtop из исходников:

    make 
    
  7. Установить usbtop:

    sudo make install 
    
  8. Загрузите модуль ядра usbmon, чтобы открыть доступ к шинам USB (Я думаю, что это то, что нужно, но я знаю, что это необходимо):

    sudo modprobe usbmon 
    
  9. Запустите usbtop (, если это не работает, используйте вместо этого sudo usbtop):

    usbtop 
    

Если я что-то пропустил, дайте мне знать в комментариях.

Установить ссылки:

2.Обновление :Вы также можете использовать iostatвместо:

sudo apt install sysstat

Запуск с интервалом в 1 -секунду с:

iostat -d 1

ИЛИ с интервалом 0,1 -секунды с:

watch -n 0.1 iostat

Пример выводаiostat -d 1:

enter image description here

Ссылки:

https://askubuntu.com/questions/3561/how-do-i-monitor-disk-activity-on-a-specific-drive

Дополнительные показания:

https://www.znetlive.com/blog/monitor-disk-io-windows-linux/

Связанные:

0
11.12.2020, 22:36
1 ответ

Нижняя структура:

├── destdir
└── srcdir
    ├── dir1
    │   └── with space.csv
    ├── dir2
    │   └── infile.csv
    └── dir3
        └── otherfile.Csv

запуск команды:

find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '
    path="${1%/*}"; filename="${1##*/}";
    echo cp -nv "${1}" "/path/to/destdir/${path##*/}.${filename}" ' sh_cp {} \;

выдает следующий вывод (работает в сухом режиме):

cp -v /path/to/srcdir/dir2/infile.csv     /path/to/destdir/dir2.infile.csv
cp -v /path/to/srcdir/dir1/with space.csv /path/to/destdir/dir1.file with space.csv
cp -v /path/to/srcdir/dir3/otherfile.Csv  /path/to/destdir/dir3.otherfile.Csv

если мы удалим echoперед командой cp(, которая используется для пробного -запуска ), чтобы получить эффект копирования и переименования,вы получите структуру ниже:

├── destdir
│   ├── dir1.with space.csv
│   ├── dir2.infile.csv
│   └── dir3.otherfile.Csv
└── srcdir
    ├── dir1
    │   └── with space.csv
    ├── dir2
    │   └── infile.csv
    └── dir3
        └── otherfile.Csv

обратите внимание, что если в подкаталогах -было одно и то же имя файла и одно и то же имя родительского каталога, он будет перезаписан последним файлом, найденным командой find, поэтому я использовал -nдля cpчтобы предотвратить это, поэтому он не будет копировать тот же файл, обратите внимание на это.


Пояснение:

find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '...' sh_cp {} \;

найти файлы с суффиксом .csv(игнорировать -case )рекурсивно и -execиспользовать встроенный-sh-скрипт для каждого sh -c '...'мы назовем его sh_cp; {}- это замена пути к файлу , который находит команда find, и мы переходим к нашему сценарию, доступному по параметру $1или ${1}.

  • ${1%/*}:вырезает кратчайший -суффикс из ${1}параметра (известный оболочка -параметр -расширение ), как указано выше ${1}— это путь к файлу и при этом мы удаляем имя файла + последний /из пути к файлу и оставляем только путь и сохраняем в переменной path.

    ${1}      --> /path/to/srcdir/dir2/infile.csv
    ${1%/*}   --> /path/to/srcdir/dir2
    
  • ${1##*/}:вырезает самый длинный префикс -из параметра ${1}; при этом мы удаляем путь из пути к файлу и оставляем только имя файла и сохраняем в переменной filename.

    ${1}      --> /path/to/srcdir/dir2/infile.csv
    ${1##*/}  --> infile.csv
    

    и соответственно:

    path                    --> /path/to/srcdir/dir2
    ${path##*/}             --> dir2
    ${filename}             --> infile.csv
    ${path##*/}.${filename} --> dir2.infile.csv
    

подсказки:

xYz='to-test/path/to/srcdir/dir2/infile.csv'
${xYz%/*}   --> to-test/path/to/srcdir/dir2
${xYz%%/*}  --> to-test
${xYz#*/}   --> path/to/srcdir/dir2/infile.csv
${xYz#*/}   --> infile.csv
1
18.03.2021, 22:43

Теги

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