2016-07-03 6 views
0

Любая идея, как я могу перемещать файлы, которые не используются каким-либо процессом, оставляя поддержку подстановочных знаков с использованием сценария bash?Переместить неиспользуемые файлы

Основная концепция:

for file in $1..$n-1 
    if ! fuser file 
    mv file $n 

где $1..$n-1 являются исходными файлами/каталогами и $n является целевым путем.

EDIT: Рабочий сценарий

#!/bin/bash 

# Move files which are not open by any process 
dest=${@:$#} # get last arg 
for file in "${@:1:$#-1}"; do # get all but last args 
    fuser "$file" >/dev/null 2>&1 && continue 
    mv "$file" "$dest" 
done 

Спасибо за помощь, ребята!

EDIT2 В этом скрипте есть ошибка, используемые файлы в некоторых каталогах не проверяются фьюзером. Позаботьтесь об этом позже.

+3

Что конкретно рассмотрены критерии для "неиспользуемых" файлов? –

+0

Не открываются никаким другим процессом, его можно проверить, используя команду 'fuser'. – null

ответ

0

Я бы передал целевой каталог как первый аргумент вместо этого. Тогда ваш псевдокод почти там.

dest=$1 
shift 
for file; do # shorthand for for file in "[email protected]"; do 
    fuser "$file" >/dev/null && continue 
    mv "$file" "$dest" 
done 
+0

Спасибо за код! Я отредактировал его и добавил поддержку, чтобы передать более естественные аргументы, а также перенаправить все выходные данные от fuser в/dev/null. – null

0

lsof даст вам, если процесс использует файлы внутри каталога, если он не используется, то переместить его в другое место.

for file in $1..$n-1;do 
    var=`lsof +D $file` 
    if [[ -z "$var" ]]; then 
     mv $file $n 
    fi 
done 
0
for x in "[email protected]" 
do 
    target="$x" 
done 
test -d "$target" ||exit  # last arg isn't a dir 


for source in "[email protected]" 
do 
    test "$source" = "$target" && continue 
    if test -d "$source" 
    then 
     # source is a dir, check all files in it 
     for f in "$source"/* 
     do 
     fuser "$f" || mv "$f" "$target" 
     done 
    else 
     # source isn't a dir 
     fuser "$source" ||mv "$source" "$target" 
    fi 
done 
Смежные вопросы