7

同じファイル名 (ただし拡張子は異なる) のすべてのファイルを、異なる拡張子を維持しながら、それらすべてのファイルの新しいファイル名に移動またはコピーする Linux スクリプトを作成したいと思います。言い換えると:

ディレクトリのリストから始めると:

file1.txt, file1.jpg, file1.doc, file12.txt, file12.jpg, file12.doc

拡張子を変更せずにすべてのファイル名を変更するスクリプトを書きたいと思います。同じ例で、新しいファイル名として file2 を選択すると、結果は次のようになります。

file2.txt, file2.jpg and file2.doc, file12.txt, file12.jpg, file12.doc

そのため、ファイル名が現在の基準に一致しないファイルは変更されません。

幸運をお祈りしています、

ジョージ

4

3 に答える 3

8

注: file1.docvariableにある場合i、式は${i##*.}拡張子を抽出します。つまりdoc、この場合です。


1 行のソリューション:

for i in file1.*; do mv "$i" "file2.${i##*.}"; done

脚本:

#!/bin/sh
# first argument    - basename of files to be moved
# second arguments  - basename of destination files
if [ $# -ne 2 ]; then
    echo "Two arguments required."
    exit;
fi

for i in $1.*; do
    if [ -e "$i" ]; then
        mv "$i" "$2.${i##*.}"
        echo "$i to $2.${i##*.}";
    fi
done
于 2013-03-23T10:13:23.863 に答える
4

util-linux-ng パッケージ (ほとんどの Linux フレーバーにはデフォルトでインストールされています) には、コマンド 'rename' があります。man rename使用説明書を参照してください。それを使用すると、タスクを簡単に実行できます

rename file1 file2 file1.*

于 2016-07-29T02:57:39.753 に答える
0

ベース名に特殊文字が含まれる入力ファイルを処理するには、plesiv のスクリプトを次のように変更します。

if [ $# -ne 2 ]; then
    echo "Two arguments required."
    exit;
fi

for i in "$1".*; do
    if [ -e "$i" ]; then
        mv "$i" "$2.${i##*.}"
        echo "$i to $2.${i##*.}";
    fi
done

$1 前後の余分な引用符に注意してください。

于 2015-01-14T19:02:20.073 に答える