ファイル名のスラッシュを変更する

ファイル名のスラッシュを変更する

したがって、すべてのファイルを指定されたディレクトリにコピーするbashスクリプトを作成する必要がありますが、文字/__

zad1.shたとえば、ファイルがディレクトリにある場合は、ファイル名を次のように変更する必要があります。/home/123456/__home__123456__zad1.sh

これを行う方法についてのアイデアはありますか?

答え1

ファイルパスを取得するには:

realpath <file>

Bashで交換:

echo "${var//search/replace}"

最初の 2 つのスラッシュは、グローバル検索を実行するために使用されます。 justを使用すると、/一度だけ置き換えることができます。

したがって、あなたのコードは

path=$(realpath zad1.sh)
path_replaced=${path//\//__}

答え2

私はこれがあなたが要求することを達成すると信じています:

#!/bin/bash

_from_dir=/path/to/files
_to_dir=/path/to/dest

for file in "${_from_dir}/"*; do
    nfile="$(sed 's#/#__#g' <<<"$file")"
    cp "$file" "${_to_dir}/$nfile"
done

_from_dir変数はファイルのあるパスに設定し、_to_dir変数はファイルをコピーするパスに設定します。

_from_dirループはその場所の各ファイルを繰り返します。nfileファイルのフルパスをインポートして/に置き換えます__。次に、ソースへのフルパスを表す名前のパスcpにファイルを配置します。_to_dir

答え3

古典的な方法はsedを使用することです。

cp "${filename}" "$(realpath ${filename} | sed s:/:__:g)"

bashを常に使用していない場合、利点は主にシェル間の移植性です。

もちろん、スクリプトをあきらめて find を使うこともできます:

find /base/path -type f -exec cp \{\} `realpath \{\} | sed s:/:__:g` \;

検索には、特定のファイルのみをコピーする必要がある場合に使用できる並べ替えとフィルタリングオプションがあります。

編集:このルックアップ設定は私のシステムの1つでは機能しますが、他のシステムでは機能しません。違いを解決する代わりに、より移植性を高めました。

find /base/path -type f | sed -e "p; s:/:__:g" | xargs -n2 cp

答え4

私は次の方法でそれをしました

ls -ltr /root/l.txt| awk '{print "cp" " " $NF,$NF}'| awk '{gsub("/","_",$NF);print $1,$2,"/root/p1/"$3}'| sh

ここで、/root/l.txt ファイルは /root/p1/ パスにコピーされますが、ファイル名は _root_l.txt になります。混乱する箇所があれば教えてください。

Here /root/p1==> destination path

関連情報