🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

2回答

261閲覧

CSVファイルから一行ずつ読み込んだ文字列を元にfindやcatを実行するシェルスクリプトを作成したい

katai_pudding

総合スコア0

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

0クリップ

投稿2024/03/22 04:41

実現したいこと

ファイル名が一行ずつ記載されているCSVファイルを用意し、
そこから一行ずつ読み込んで、記載されているファイル名の中身を表示させるシェルスクリプトを作成したいです。

シェルスクリプトも初心者で、teratailでの質問も初めてのため、
わかりづらい質問で申し訳ありません。

発生している問題・分からないこと

以下のようにスクリプトを書いたのですが、

該当のソースコード

ShellScript

1#!/bin/zsh 2 3while read row; do 4 5 file=`echo ${row} | tr -d "\r"` 6 find "**/${file}" 7 8done < FileName.csv

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

全行について
find: **/[ファイル名]: No such file or directory
が返ってきてしまいます。

CSVファイルFileName.csvの内容は、一行ずつファイル名が記載されているような内容です。

最終的には、findではなくcatで、ファイルの中身を一行ずつCSVに書き込みたいと考えています。
(まだ試していないので具体的な質問ができないのですが、
ファイルの中身に改行があると、CSVファイルに書き込む際にも改行されてしまいそうですね。
1つのファイルの中身は一行にまとめたいのですが…)

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/03/22 05:06

find "**/${file}" は、 find . -name "${file}" ではないでしょうか。
guest

回答2

0

findコマンドは検索基点のディレクトリとオプションで構成し、オプションで対象を-nameで指定します。
Oracleなどのリファレンスをご一読いただくと、今後のためにも良いかもしれません。

投稿2024/03/22 11:43

Refrain

総合スコア539

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2024/03/22 12:22

macOSなのではないかと思いました。
guest

0

find "**/${file}"と、*は引用符の中なので、ワイルドカードの意味は消えて「アスタリスクという1文字」の意味となります。
アスタリスク2文字を名前に持つディレクトリーはそこに存在しないでしょうから、 No such file or directory ですね。

例:ls *.txt → ファイル名が.txtで終わるファイルを表示
ls "*.txt" → ファイル名が*.txtというアスタリスクで始まってその後に.txtが続くファイルを表示

Windowsだと * はファイル名・ディレクトリー名に使えない文字ですが、Unix/Linuxにはそういう制約は無いですからファイル名にも使えます(パス区切りの/とNUL文字だけは使えない)。

全体的に、やりたいことをもっと丁寧に言語化しましょう。今の記述だけだと何をしたいのか不明です。

記載されているファイル名の中身を表示させるシェルスクリプトを作成したいです。

が文字通りの意味であれば、6行目はcat "${file}"でいいです。
おそらくそうではないからfindとか**が登場したのだと思いますが。

ファイルの中身に改行があると、CSVファイルに書き込む際にも改行されてしまいそうですね。1つのファイルの中身は一行にまとめたいのですが

これも、複数行の中味を持つファイルが複数個ある場合に、最終的にどんなファイルを作りたいのか不明。

text

1ファイル1の1行目,ファイル1の2行目,ファイル1の3行目,ファイル1の4行目,・・・・ 2ファイル2の1行目,ファイル2の2行目,ファイル2の3行目,ファイル2の4行目,・・・・ 3・・・・

のようなファイルを作りたいと言うことでしょうか。
であれば、paste -d, -s "${file}"で、カンマ区切りで1行になります。

投稿2024/03/25 00:10

otn

総合スコア85862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問