2016-07-03 23 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 
関連する問題