Qanday qilib papkada joylashgan har bir faylni aylantirish mumkin?

Sinov deb nomlangan papkam bor. Ushbu papkada matematika, fizika va ingliz tillarida uchta papka mavjud. Ushbu papkalarning barchasi ulardagi ba'zi kichik papkalarga va fayllarga ega. Har bir jilddan o'tib, har bir papka va faylning yo'lini fayllar deb nomlangan boshqa faylga chop etishni xohlayman. Men buni qildim:

#!/bin/bash

LOC="/home/school/exam/*"

{
  for f in $LOC 
  do
   echo $f
  done
 } > "files"

Qabul qiladigan chiqishim:

/ uy/maktab/imtihon/matematika

/ uy/maktab/imtihon/fizika

/ uy/maktab/imtihon/english

Kodni tekshirishni qanday qilib bajarish kerakligini bilmayman va xuddi shu narsani imtihonning pastki papkasida bajaraman. Har qanday taklif bormi?

PS Shell skriptida yangi boshlovchi bo'laman.

1

5 javoblar

find /home/school/exam -print > files
3
qo'shib qo'ydi
Agar savolingizni tushunsam, faqatgina imtihon katalogining boshlig'i bilan ishchi katalog sifatida tekshiruv-fayllar> fayllarni toping . ~/exam dan foydalanish faqat o'zlarining asosiy katalogida testi katalogiga ega bo'lganlar uchun ishlaydi.
qo'shib qo'ydi muallif Michael Hoffman, manba
bu ishni qiladi. Ammo endi men buni o'ylayman, men bu komandani jamoaning bir qismi sifatida qilyapman va jamoada bo'lganlarning barchasi imtihon papkasida boshqacha yo'l bor, chunki u ishlay olmaydi deb o'ylamayman. Buni qanday o'zgartirish mumkin? Men */exam -print fayllarini topishga harakat qildim, lekin bunday fayl yoki katalog yo'q.
qo'shib qo'ydi muallif captain, manba
OK, buni ~/exam -print> fayllariga o'zgartirdim va u ishlaydi. Lekin, albatta, bu imtihon papkasiga ega bo'lgan boshqa kompyuterlarda ishlash kerakmi?
qo'shib qo'ydi muallif captain, manba
Ular imtihon katalogiga ega. O'ylaymanki, u ishlaydi. Buni imkon qadar qisqa vaqt ichida sinab ko'raman. Javoblaringiz uchun tashakkur.
qo'shib qo'ydi muallif captain, manba

globstar variantini bash bilan ikki ulashgan yulduzdan foydalanilganda barcha fayl nomlarini pastki katalogda qaytaradi

foydalanish:

shopt -s globstar
for i in /home/school/exam/**

Malumot bu erda man bash :

globstar
                      If set, the pattern ** used in a pathname expansion context
                      will match all files and zero or more directories and
                      subdirectories.  If the pattern is followed by a /, only
                      directories and subdirectories match.

va info bash :

          *      Matches any string, including the null string.  When  the
                 globstar  shell  option  is  enabled,  and * is used in a
                 pathname expansion context, two adjacent  *s  used  as  a
                 single  pattern  will  match  all  files and zero or more
                 directories and subdirectories.  If followed by a /,  two
                 adjacent  *s  will match only directories and subdirecto‐
                 ries.
2
qo'shib qo'ydi

Buning uchun barcha fayllarni o'z-o'zidan ro'yxatga olish kerak.

for i in *; do ls -l $i ; done
1
qo'shib qo'ydi

find buyrug'ini ishlatishingiz mumkin, u barcha fayllarni olishi mumkin, masalan, masalan, exec yoki xargs dan foydalanib, siz ularga biror narsa qilishingiz mumkin.

0
qo'shib qo'ydi

Siz ko'pincha * nix tarqatishda mavjud tree buyrug'ini ham ishlatishingiz mumkin. (Ubuntu juda katta istisno bo'lsa-da, lekin apt-get orqali o'rnatilishi mumkin)

LOC="/home/school/exam/"
tree -if $LOC > files
0
qo'shib qo'ydi