Лично я бы использовал цикл find
и while
, так как вы можете указать тип файла с помощью -type d/f
для каталога/файла соответственно
как "один вкладыш" из каталога, из которого вы будете запускать:
find. -maxdepth 1 -type f -name "*.*" | while IFS="" read -r line; do filename=$(basename -- "$line"); extension="${filename##.}.files"; mkdir -p "$extension"; mv "$line" "$extension"; done
Или в сценарии:
#!/bin/bash
find. -maxdepth 1 -type f -name "*.*" |
while IFS="" read -r line; do
filename=$(basename -- "$line")
extension="${filename##.}.files"
mkdir -p "$extension"
mv "$line" "$extension"
done
find.
-находит файлы и каталоги из текущего каталога
-maxdepth 1
-проверяет только текущий каталог (2 также проверяет каталоги следующего уровня)
-type f
-соответствует только файлам
-name *.*
-любой файл с "." во имя
Я также изменил расширение на .files
в одном объявлении переменной, поскольку я предполагаю, что это то, что вам нужно. Если вы хотите, чтобы tmp.txt
находилась в каталоге с именем tmp.txtfiles
вместо (, как в вашем сценарии в настоящее время ), просто удалите "." вот так:
extension="${filename##.}files"
Итак, как указал @Kusalananda, зацикливание на find
может быть плохой идеей. При этом вы все еще можете использовать find
для этого, просто используя вместо этого временный файл для зацикливания:
#!/bin/bash
find. -maxdepth 1 -type f -name "*.*" > myTemporaryFile
IFS=$'\n' # in case any filenames have spaces in them
for line in $(cat myTemporaryFile); do
filename=$(basename -- "$line")
extension="${filename##.}.files"
mkdir -p "$extension"
mv "$line" "$extension"
done
rm myTemporaryFile
Для этого вам понадобится внешний инструмент. Проверьте, например,:
reredirect is a utility for taking an existing running program and attaching its outputs (standard output and error output) to files or another process.
илидуплекс
Dupx is a simple *nix utility to redirect standard output/input/error of an already running process.
Dupx is currently implemented as a simple shell script that drives GDB.