1

私はスクリプトを持っています

for d in $(find /home/users/*/personal/*/docs/MY -type d); do
    find $d -maxdepth 1 -type f -amin -10
done

Linux サーバーで 10 分間に作成された MY ディレクトリ内のすべてのファイルが一覧表示されます。条件に一致するこれらすべての検索されたファイルの名前を、プレフィックス old_ を追加して変更する方法を探しています。スクリプトがファイルaaaaandを見つけた場合、それらの名前をandbbbbに変更します。old_aaaold_bbbb

誰かが私を助けることができますか?

4

4 に答える 4

1

findあなたのためにすべてのファイルを見つけましょう:

find /home/users/*/personal/*/docs/MY -type f -amin +10 -print0 |  
while IFS= read -r -d $'\0' path; do
    dir=$(dirname "$path")
    name=$(basename "$path")
    if [[ $name != old_* ]]; then
        echo mv "$path" "$dir/old_$name"
    fi
done

うまく機能していることに満足したら、「エコー」を削除します。

于 2012-09-19T13:47:07.400 に答える
0

次のようにしてください:

for d in $(find /home/users/*/personal/*/docs/MY -type d); do
    find $d -maxdepth 1 -type f -amin -10 | { read bn; basename "$bn"; } | rename "s/()/old_\$1/"
done

また-amin -10、過去10分間にアクセスされたファイルを指すことにも注意してください。これには、過去10分間に作成されたファイルが含まれますが、他のファイルも含まれる可能性があります。

更新:コマンドを使用して名前を変更し、正規表現を使用しないため
、おそらく上記よりも高速な代替方法は次のとおりです。mv

for d in $(find /home/users/*/personal/*/docs/MY -type d); do
    find $d -maxdepth 1 -type f -amin -10 | { read bn; basename "$bn"; } | { read fn; mv "$fn" "old_$fn"; }
done

更新2
OPがコメントで指摘したエラーを修正するために、上記の2つのコマンドを更新しました。

于 2012-09-19T12:33:13.333 に答える
0

オプションを使用してください-exec

find "$d" -maxdepth 1 -type f -amin -10 -exec mv "{}" "old_{}" \;

コメント:

  1. 引用符を使用して、スペースが問題にならないようにします。上記のループでは、次を使用する必要があります

    find "/home/users/"*"/personal/"*"/docs/MY" -type d
    

    これは厳密には必要ではありませんが、これを習慣に変えて、重要なときに忘れないようにすることをお勧めします。

    また、は引用符の*にある必要があることに注意してください。

  2. 周囲の引用符{}は特殊文字を保護するため、findコマンドは特殊文字を認識します(そうでない場合、シェルは特殊文字を解釈しようとします)。同じ理由で、\前にあります;

[編集]\! -name "old_*"「すでに始まるファイルの名前を変更しないでください」という意味のファイルを検索に追加することをお勧めし_oldます。

于 2012-09-19T12:02:28.377 に答える
0

old_old_old_old_... ファイルが必要ない場合は、次のことを試してください。

find "$d" -maxdepth 1 -type f -amin -10  -exec grep -q -v "old_" {} \; -exec mv "{}" "old_{}" \; 

PS: 前の投稿にコメントしたかったのですが、許可されていません。

于 2012-09-19T12:11:21.570 に答える