2016-07-14 5 views
0

ソフト/シンボリックリンクを作成するスクリプトを作成する必要がありますが、リンクが '〜/ linkedfiles'ディレクトリに既に存在するかどうかを検出する必要がありますが、$ fileにはサブディレクトリ。 ($ファイルは '〜/ realfiles/files/file23.gz'のようになりますが、私は 'file23.gz'のみ必要です)。だから私の質問は、$ fileのサブディレクトリを削除する方法です。ここでwhileループでサブディレクトリを隠す

は、一例として、いくつかのコードです:元のスクリプトの

for file in ~/realfiles/files/*.gz 
do 

echo "Linking file: $file" 
ln -s $file ~/linkedfiles 
if [ $? -ne 0 ]; then 
echo "[FAIL] Linking of $file failed!" 
else 
echo "[SUCCESS] $file successfully linked." 
fi 
done 
+0

'man find'では、' -type'を検索します。 – bishop

+0

あなたのコードによれば、 '$ file'は' .gz'ファイルを含みます。どのようにサブディレクトリが含まれていますか? – Fazlin

答えて

1

パスのベース名が必要なようです。これを行うには2通りの方法があります - 古典的な信頼性の高い方法はbasenameコマンドであり、現代では常に信頼できない方法はshell parameter expansionです。

for file in ~/realfiles/files/*.gz 
do 
    echo "Linking file: $file" 
    ln -s "$file" "~/linkedfiles/$(basename "$file")" 
    if [ $? -ne 0 ] 
    then echo "[FAIL] Linking of $file failed!" 
    else echo "[SUCCESS] $file successfully linked." 
    fi 
done 

または:両方のスクリプトで

for file in ~/realfiles/files/*.gz 
do 
    echo "Linking file: $file" 
    ln -s "$file" "~/linkedfiles/${file##*/}" 
    if [ $? -ne 0 ] 
    then echo "[FAIL] Linking of $file failed!" 
    else echo "[SUCCESS] $file successfully linked." 
    fi 
done 

質問の明瞭度を改善する余地があるものの、ファイル~/realfiles/files/file23.gzは(私はあなたが後にしている考えるものである、~/linkedfiles/file23.gzにリンクされます、サンプルファイル名の望ましい結果を引用するなど)。

0

若干の修正は

for filename in ~/realfiles/files/*.gz 
do 
echo "Linking file: $file" 
[[ -h "~/linkedfiles/${var##*/}" ]] && continue 
ln -s "$filename" ~/linkedfiles/ 
if [ $? -ne 0 ] 
then 
    echo "[FAIL] Linking of $filename failed!" 
else 
    echo "[SUCCESS] $filename successfully linked." 
fi 
done 

ノート

  • -hオプションをしますかファイルがシンボリックリンクの場合は[ checks ]
  • ${var##*/}にはベース名が与えられます。 [ parameter expansion ]を確認してください。
+0

'find'は既に' -h'が行っていることを何も追加しません( 'find'コマンドに'!-type l'を追加し、 '-h'テストをループにドロップすることもできます)。 – chepner

0
targetdir="$HOME/linkedfiles"  
for filename in $HOME/realfiles/files/*.gz; do 
    # if filename is a regular file then ... 
    if [[ -f "${filename}" ]]; then 
     # if softlink does not exist in target then link it 
     if [[ ! -h "${targetdir}/${filename##*/}" ]]; then 
      echo "Linking ${filename}" 
      ln -s "${filename}" "${targetdir}" 
      (($? == 0)) && echo 'Link created' || echo 'Create link fails' 
     else 
      echo "Skipping because ${filename##*/} exists in ${targetdir}" 
     fi 
    fi 
done 
+0

私は次のように使います:ln -sf $ {filename} targetdir –

+0

'cmd; ($?== 0))&& echo'はもっと簡潔で、イディオム的に、移植可能に 'cmd && echo'と書かれています。 – tripleee

+0

@treepleee、そうです。 –

関連する問題