• 締切済み

Perlについて

あるテキストファイルからディレクトリだけを抜き出して各ディレクトリにパーミッションをつけたいのですがやりかたはシェルスクリプトでやろうとかんがえています。 #!/usr/bin/bash while read x1 x2 x3 x4 x5 x6 x7 x8 x9 ; do echo $x1 | grep ^d > /dev/null 2>&1 if(($?==0));then echo mkdir -p $x9 fi done < file.txt とディレクトリを作るところからパーミッションはどう書けばわかりません。当方初心者なのでわからないことがおおいです。 ご教授お願いします。 ~

  • Perl
  • 回答数2
  • ありがとう数2

みんなの回答

回答No.2

> file.txtにパーミッションがずらーと  > drwxr-xr-x > drwxr-xr-x なっていて 上記のように特定の条件のパーミッションを変更する? という意味だと、UNIX環境なら find コマンドが最適です。 例えば・・・・ # find / -perm a+rw -exec chmod 777 {} \; 全ユーザーが読み込み・書き込み可能なファイルを 777 に変更する。 末尾の『¥;』は -exec を使う場合の決まり文句なのでオマジナイと思って下さい。 find で選択できない複雑なケースは ls, grep, awk(perl) などを組み合わせて chmod 777 (target 1) chmod 777 (target N) を作成し、前回のように | bash で処理

rurinko
質問者

お礼

回答ありがとうございます。大変お世話になりました。

rurinko
質問者

補足

rwxr-wr-w rwxr-wr-- rwxr-wr-t の内容のテキストファイルのパーミッションの変更コマンドをシェルスクリプトで書くにはどうしたらいいのかわかりません。 おしえていただくとありがたいです。 最初の一文字づつを読み込んでchmod ???と数字がでるようにしたいのですが 実行結果 ./a.txt r w x r - w r - w chmod 755と実行結果がでるようにしたいです。

回答No.1

 どのような用途で利用するのか不明ですが、パーミッション変更などの操作をPerlなどで記述すると、あとで何をどのように変更したのかが分からなくなって困ると思いますが・・・ 単純に下記のファイル(chmod.txt)を作成し、処理する方が作業内容が明確になって良いと思いますよ ^ ^ chmod.txtが煩雑で Perl等で作成するのはお勧めです。 ----chmod.txt-- chmod 777 /usr/local/xxx chmod 644 /usr/local/man chmod 400 /usr/local/shar ---- パーミションの変更操作 # cat chmod.txt | bash

rurinko
質問者

お礼

さっそくの回答ありがとうございます!! file.txtにパーミッションがずらーと  drwxr-xr-x drwxr-xr-x なっていてwhileなどを使ってシェルスクリプトできるのでしょうか?

関連するQ&A

  • PostgreSQLをCentOS5にインストールしました。

    閲覧有難うございます。 質問内容なのですが、Postgresqlをインストールしたのですがpostgresql.confとpg_hba.confが見つかりません。 OSはCentOS5です。 インストール方法は以下の手順で行いました。 # /usr/sbin/adduser postgres # chown postgres:postgres /usr/local/pgsql # mkdir /usr/local/src/postgres-8.2.6 # chown postgres:postgres /usr/local/src/postgresql-8.3.7 # su - postgres # cd /usr/local/src # tar xfz /usr/local/src/postgres-8.2.6.tar.gz # cd /usr/local/src/postgres-8.2.6 # ./configure # make # make install また、 [root@ ~]# su - postgres -bash:  LD_LIBRARY_PATH=/usr/local/pgsql/lib: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  PATH=/usr/local/pgsql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  MANPATH=/usr/local/pgsql/man:: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  export: command not found -bash:  PATH=/usr/local/pgsql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin: そのようなファイルやディレクトリはありません -bash:  export: command not found -bash:  MANPATH=/usr/local/pgsql/man:: そのようなファイルやディレクトリはありません -bash:  export: command not found [postgres@ ~]$ のようなエラーがはかれるようになりました。 どうか皆様のお力をお貸しください。

  • ドットを含まないファイルの表示

    ドットを含まないファイルをperlで表示したいのですが、 うまくいきません。 シェル上から「ls | grep -v "\."」を実行すれば、 意図した結果は得られています。 しかし、perl上で動作させると、何も表示されません。 #! /usr/bin/perl chdir("/tmp"); open(DIR_IN, "ls -l | grep -v '\.' 2> /dev/null |"); while($file=<DIR_IN>) { print $file; }

    • ベストアンサー
    • Perl
  • シェルスクリプトとコマンドライン

    iptablesログからSRC=10.10.10.10の通信ログを取得しようとしました。 見よう見まねで下記コマンドラインを作成しました。 【コマンドワンライナー】 for ((i=1;i<9;i++));do da="2013012"$i;logfile=iptables.log-$da.gz ; echo -n $ logfile':';zcat $logfile | grep SRC=10.10.10.10 |wc -l;done 2>/dev/null このとき、所々に「;」を入力しました。 なぜ、;(セミコロン)をそこで入れる必要があったのかが分からないのです。 多分シェルスクリプトで記述した時の 「改行の位置?」ではないかと思っているのですが この認識で間違っていないでしょうか? 【シェル記述 改行の位置で;(セミコロン?)】 #!/bin/sh for ((i=1;i<9;i++))  do da="2013012"$i  logfile=iptables.log-$da.gz  echo -n $logfile':';zcat $logfile | grep SRC=10.10.10.10 |wc -l done 2>/dev/null ご教授お願いします。

  • パス(PATH)の設定ファイルについて

    OSはRed Hat Linux 9 を使用しております。 また、シェルはbashを使用しております。 ユーザがシステムにログインする際は、通常ですと /etc/profile ~/.bash_profile ~/.bash_login ~/.profile ファイルを読込、パス(PATH)の設定を行うと思いますが、 sshでrootユーザでシステムにログインした際は、 「echo $PATH」の結果は以下でした。 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/sbin su -で再度rootユーザでログインした際、もしくは、他ユーザからsu -でログインすると 「echo $PATH」の結果は以下でした。 /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin:/sbin ログインの仕方でパス(PATH)に違いがあります。 また、「/usr/local/bin」をパス(PATH)として設定している記述が 上記ファイルに見当たりません。 http://sakaguch.com/PastBBS/0038/B0018808.html http://oshiete1.goo.ne.jp/kotaeru.php3?q=800405 等のサイトを参考に、以下ディレクトリ配下を確認しましても /etc/profile.d /etc/rc.d/init.d /etc/rc.d/rc3.d 「/usr/local/bin」をパス(PATH)として設定している記述が 見当たりません。 ログインの仕方でパス(PATH)に何故違いがあるのか、 また「/usr/local/bin」をパス(PATH)として設定している記述がある ファイルをご存知の方ご教授頂きたく思います。 宜しくお願いします。

  • 想定外の戻り値に付いて

    Linux系OSのシェルスクリプトについて質問です。 スクリプトの内容としては各主要サービスの起動と停止を行う内容になります。 ここでお伺いしたい内容はスクリプトの途中でサービスが起動しているかどうか、grepの戻り値によって処理を変更する場合にgrepの戻り値がどうにもおかしい場合、どのような原因が考えられるか、ということです。 【スクリプト内容(抜粋)】 #!/bin/bash ---中略--- echo "Apache2起動前確認" | tee -a ${LOG} ps -ef | grep apache2 | grep -v "grep" > /dev/null if [ $? == 0 ]; then ---省略--- 上記の内容はapache2を起動する際、apache2が起動していれば処理を中止する内容の一部ですが、当然起動していればpsコマンドで内容が出るのでgrepの戻り値は0になり、「then」の内容が実施されます。 これはこれで完成されているので問題なく稼動します。 しかしこれとまったく同じ内容で、apache2をmysqlに変更したものが問題でこちらが正常に動作しないのです。 【スクリプト内容(抜粋)】 #!/bin/bash ---中略--- echo "MySQL起動前確認" | tee -a ${LOG} ps -ef | grep mysql | grep -v "grep" > /dev/null if [ $? == 0 ]; then ---省略--- これだとなぜか停止しているときに戻り値が「0」、起動しているときに戻り値が「1」になってしまいます。 ifとpsの間に「echo $?」をかませてみても想定外の戻り値がセットされているためif文そのものには間違いはありません。 また、コマンドラインで「ps -ef | grep mysql | grep -v "grep" > /dev/null ; echo $?」を 実施しても戻り値は「1」に(停止している場合)なるのですが、スクリプト上では戻り値「0」がセットされるようです。 何ゆえこのような意図しない動作をするのか考えてもわかりません。 apache2の場合だと正常に動くだけになおわかりません。 因みに停止しているとき、起動しているときでまったく逆の戻り値がそれぞれ返ってきているようです。 どなたか原因がわかる人は教えてください、宜しくお願いいたします。

  • sshdコマンドへのpathの貼りかた

    Linuxに関して質問があります。ターミナルでsshdを入力すると、 [xyz@localhost ~]$ sshd bash: sshd: command not found と出ます。 echo $PATHをやると、 [xyz@localhost ~]$ echo $PATH /usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/xyz/bin:/sbin とでます。 pathが通っていないのだと思うのですが、 .bash_profileに何と追記すれば良いのでしょうか?御教示下さい。宜しくお願い致します。

  • Cシェルについて

    Cシェルについて #! /bin/csh ##! /bin/csh -vx setenv NOHUP '/usr/bin/nohup' set AAA_CSH = $NOHUP' XXX.sh file.txt &' ($AAA_CSH >> /dev/null) >>& err.log シェルスクリプトを作成して上記のとおりnohupでXXX.shを実行するように記述します。 エラーがあった場合、err.logに出力するように作成したつもりなのですが、 XXX.shがなかったとき、 「/usr/bin/nohup: XXX.sh:そのようなファイルまたはディレクトリはありません。」 と標準出力されてしまいます。 このエラーメッセージをerr.logに記述するようにしたいのですが、 どうしたらよいでしょうか? よろしくお願いいたします。

  • シェルスクリプトの作り方

    OSはVineで、bashシェルです。 シェルスクリプトの作り方ですが、 1.ファイルを作る。 例えば、 #!bin/sh cd tmp このとき、ディレクトリはどこでもいいのでしょうか? 2.権限を付ける。 chmod u+x filename 3.実行 ./filename 他に気をつけることはないでしょうか? 実行すると、 bash: ./filename: bad interpreter: そのようなファイルやディレクトリはありません となってしまって、どうしても実行できません。

  • Linux シェルの trap について

    お世話になります。 シェルについて、どなたかご教授頂けますと幸いで御座います。 以下、★処理を実施していますが、シェル.sh を実行中に Ctrl+\ で終了(シグナル)しても トラップ処理が実行されません。"| tee -a ファイル名" を削除し、シェル.sh のみ実行すると、 トラップ処理が実行されます。何か、良いアイデアは御座いますか?? ******************************************************* #!/bin/bash #------------------------------------------------------------------------------ # Trap #------------------------------------------------------------------------------ trap 'echo "trapped."; トラップ処理 >> /dev/null 2>&1;exit 1' 1 3 15 trap '' 2 umask 022 : <中略> : #------------------------------------------------------------------------------ # main #------------------------------------------------------------------------------ シェル.sh | tee -a ファイル名 ★ #シェル.sh *******************************************************

  • shで、パスがとおりません

    シェル内の リダイレクトのパスが通らない原因は何でしょうか? ◆シェル実行時のエラー bash: ./bb.sh: bad interpreter: No such file or directory ◆シェル(PostgresqlへCSVデータ取込) #!/bin/sh /usr/local/pgsql/bin/psql -d swan2 -c "copy abctbl_wk from stdin using delimiters ',' with null as ''" < ./csv/abcTBL.csv

専門家に質問してみよう