2016-07-03 26 views
0

任何想法如何移動未使用任何進程使用bash腳本支持通配符的文件?移動未使用的文件

基本概念是:

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

其中$1..$n-1是源文件/目錄和$n是目標路徑。

編輯:工作腳本

#!/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 該腳本存在一個錯誤,在某個目錄下使用的文件沒有被fuser檢查。稍後會檢查。

+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