উত্তর: একটি ডিরেক্টরিতে থাকা ফাইল এবং ফোল্ডারগুলি কীভাবে মুছবেন?


152

নীচের কোডটি কেবল ওয়েব ফাইলের ভিতরেই প্রবেশ করে only আমি ওয়েব ডিরেক্টরিতে থাকা সমস্ত ফাইল এবং ফোল্ডারগুলি সরিয়ে ওয়েব ডিরেক্টরিটি ধরে রাখতে চাই। আমি এটা কিভাবে করবো?

  - name: remove web dir contents
     file: path='/home/mydata/web/{{ item }}' state=absent
     with_fileglob:
       - /home/mydata/web/*

দ্রষ্টব্য: আমি rm -rfকমান্ড এবং শেলটি ব্যবহার করার চেষ্টা করেছি , কিন্তু তারা কাজ করে না। সম্ভবত আমি সেগুলি ভুলভাবে ব্যবহার করছি।

সঠিক দিকটিতে যে কোনও সহায়তা প্রশংসিত হবে।

আমি উত্তরসূচক 2.1.0.0 ব্যবহার করছি


দেখতে বাগের মতো লাগছে।

উত্তর:


132

নীচে কোড পুরো বিষয়বস্তু মুছে ফেলবে artifact_path

- name: Clean artifact path
  file:
    state: absent
    path: "{{ artifact_path }}/"

দ্রষ্টব্য : এটি ডিরেক্টরিটিও মুছে ফেলবে।


3
উদ্ধৃতি প্রয়োজন হয় না। এটি কেবল আমার কাজের কোড। আর্টিফ্যাক্ট_পথটি হ'ল অ্যাপ / মাই_এপ / ওয়ার্ক /
মোহন কুমার পি

83
ওপি (এবং আমি) এমন একটি সমাধান চাই যা ফোল্ডারটির সামগ্রীগুলি মুছে ফেলবে তবে ফোল্ডারটি নয়। এই সমাধানটি সামগ্রী এবং ফোল্ডারটি নিজেই মুছে দেয়।
স্টোকাস্টিক

19
এটি কীভাবে উপার্জন পেল? এটি ডিরেক্টরিটিও মুছে দেয়।
deppfx

17
আর্টিফ্যাক্ট_পথটি শূন্য থাকায় কি কারো উপরের কোডটি ব্যর্থ হয়েছে? এটি rm -rf /ইতিহাসের দুর্দান্ত মুহুর্তগুলির মধ্যে একটির পক্ষে সংবেদনশীল হতে পারে বলে মনে হয়
টেড-কে 42

2
@ টেড-কে 42 আমি নিরাপদ থাকার জন্য এই জাতীয় কিছু করব:when: artifact_path is defined and artifact_path != ""
বামাপিন

69

শেল মডিউল ব্যবহার করে ( আদর্শবানও ):

- shell: /bin/rm -rf /home/mydata/web/*

আপনি যদি তৈরির তারিখ এবং মালিক / অনুমতি সম্পর্কে চিন্তা না করেন তবে সবচেয়ে সহজ সমাধান:

- file: path=/home/mydata/web state=absent
- file: path=/home/mydata/web state=directory

7
কাজ করে তবে ফাইলগুলি সরানো হয়নি didn't htaccess
আব্বাস

শেলও আমার পক্ষে কাজ করেছিল। সঠিক একই কাজের কিন্তু অদলবদল shellজন্য commandএবং এটি কাজ করে
SomethingOn

4
ওয়াইল্ডকার্ডস কমান্ড নিয়ে কাজ করবে না কারণ তাদের সম্প্রসারণের জন্য শেল
লাগবে

1
মনে রাখবেন যে আপনি তৈরির মুহুর্তের সময় স্পষ্টভাবে সেট না করে এটি আপনার অনুমতি / মালিককে পরিবর্তন করতে পারে।
নেভারইন্ডিংকিউ

শেল ব্যবহার করে আপনি শেল আরএমের পরিবর্তে state = অনুপস্থিত ফাইল মডিউলটি ব্যবহারের একটি সতর্কতা পাবেন। এটি এড়ানোর জন্য কেবল যুক্তি যুক্ত করুন: সতর্কতা: মিথ্যা
রডরিগো

60

ডিরেক্টরি সরান (মূলত https://stackoverflow.com/a/38201611/1695680 এর একটি অনুলিপি ), জবাবটি rmtreeহুডের নীচে এই অপারেশনটি করে ।

- name: remove files and directories
  file:
    state: "{{ item }}"
    path: "/srv/deleteme/"
    owner: 1000  # set your owner, group, and mode accordingly
    group: 1000
    mode: '0777'
  with_items:
    - absent
    - directory

যদি আপনার কাছে পুরো ডিরেক্টরি মুছে ফেলা এবং এটি পুনরায় তৈরি করার বিলাসিতা না থাকে তবে আপনি এটি ফাইল, (এবং ডিরেক্টরিগুলি) এর জন্য স্ক্যান করতে পারেন এবং একে একে মুছে ফেলতে পারেন। যা কিছুটা সময় নেবে। আপনি সম্ভবত নিশ্চিত করতে চান যে [ssh_connection]\npipelining = Trueআপনার উত্তরসূচক সিএফজি চালু আছে।

- block:
  - name: 'collect files'
    find:
      paths: "/srv/deleteme/"
      hidden: True
      recurse: True
      # file_type: any  # Added in ansible 2.3
    register: collected_files

  - name: 'collect directories'
    find:
      paths: "/srv/deleteme/"
      hidden: True
      recurse: True
      file_type: directory
    register: collected_directories

  - name: remove collected files and directories
    file:
      path: "{{ item.path }}"
      state: absent
    with_items: >
      {{
        collected_files.files
        + collected_directories.files
      }}

6
প্রথম কাজটি আমি দেখেছি সবচেয়ে মার্জিত সমাধান। যে কোনও জায়গায় মন্তব্যগুলি নোট করুন যাতে দীর্ঘকাল ধরে চলার বৈশিষ্ট্য যুক্ত করার অনুরোধ রয়েছেstate=empty
উইলিয়াম তারেল

24

আমি আরএম সমাধানটি সত্যিই পছন্দ করি না, উত্তরদায়ী আপনাকে আরএম ব্যবহার সম্পর্কে সতর্কতা দেয়। সুতরাং এখানে কীভাবে আরএমের প্রয়োজন ছাড়াই এবং জবাবদিহি সতর্কতা ছাড়াই এটি করা যায়।

- hosts: all
  tasks:
  - name: Ansible delete file glob
    find:
      paths: /etc/Ansible
      patterns: "*.txt"
    register: files_to_delete

  - name: Ansible remove file glob
    file:
      path: "{{ item.path }}"
      state: absent
    with_items: "{{ files_to_delete.files }}"

উত্স: http://www.mydailytutorials.com/ansible-delete-mpleple-files-directories-ansible/


তবুও প্রশ্নের সেরা সমাধান !!
ভেসেগার

18

নীচের আদেশটি চেষ্টা করুন, এটি কাজ করা উচিত

- shell: ls -1 /some/dir
  register: contents

- file: path=/some/dir/{{ item }} state=absent
  with_items: {{ contents.stdout_lines }}

3
আপনি সঠিকভাবে শেষের লাইনে escape {,} with_items: "{{ contents.stdout_lines }}"
obtain

lsফাইলের নাম পেতে আউটপুট ব্যবহার করা বিপজ্জনক কারণ এটি নিউলাইনগুলির মতো বিশেষ অক্ষরগুলির সাথে ফাইলের নামগুলি সঠিকভাবে মুদ্রণ করে না।
bfontaine

5

সমস্ত মন্তব্য এবং পরামর্শ থেকে একটি সামগ্রিক পুনঃনির্ধারিত এবং ব্যর্থ-নিরাপদ বাস্তবায়ন তৈরি করেছে:

# collect stats about the dir
- name: check directory exists
  stat:
    path: '{{ directory_path }}'
  register: dir_to_delete

# delete directory if condition is true
- name: purge {{directory_path}}
  file:
    state: absent
    path: '{{ directory_path  }}'
  when: dir_to_delete.stat.exists and dir_to_delete.stat.isdir

# create directory if deleted (or if it didn't exist at all)
- name: create directory again
  file:
    state: directory
    path: '{{ directory_path }}'
  when: dir_to_delete is defined or dir_to_delete.stat.exist == False

আমি মনে করি আপনি মিস registerকরছেন plugin_dir_deleted, তাই না?
বব ভর্ক

এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. এই কোডের টুকরোটি আমার প্লেবুকগুলির মধ্যে একটি থেকে নেওয়া হয়েছিল এবং নামকরণের ক্ষেত্রে এটি আরও জেনেরিক করে তুলেছে তবে দুটি ভেরিয়েবলের নাম বদলাতে ভুলবেন না
মার্কাস

1
ভাল স্টাফ, তবে আমি মনে করি শেষ কার্যের রাজ্যটিকে "উপস্থাপিত" না করে "ডিরেক্টরিতে" সেট করা দরকার।
অ্যান্ড্রু অ্যালায়ার

1
অনুমতিগুলি সংরক্ষণের জন্য আপনার স্ট্যাটাস ফলাফলটি ব্যবহার করা উচিত: পিডাব্লু_নামের মালিক, জিআর-নেম থেকে গোষ্ঠী এবং মোড থেকে মোড।
ডিলানইং

চেষ্টা owner: dir_to_delete.stat.pw_name, group: dir_to_delete.stat.gr_name mode: dir_to_delete.stat.modeকরেও তা আমার বর্তমান উত্তরীয় সংস্করণটি নিয়ে আমার কাছে ব্যর্থ হয় :(
মার্কাস

3

ফাইল গ্লোব ব্যবহার করেও এটি কাজ করবে। আপনার পোস্ট করা কোডটিতে কিছু সিনট্যাক্স ত্রুটি রয়েছে। আমি পরিবর্তন করেছি এবং পরীক্ষা করেছি এটি কাজ করা উচিত।

- name: remove web dir contents
  file:
    path: "{{ item }}"
    state: absent
  with_fileglob:
    - "/home/mydata/web/*"

7
with_fileglobকেবল স্থানীয় মেশিনে কাজ করে, দূরবর্তীটি নয়; এটা সত্য না?
স্টেপান ভাভরা

সত্য .. সাথে_ফলেগ্লোব কেবল স্থানীয়দের জন্য
দীপালী মিত্তাল

এছাড়াও, এটি ডিরেক্টরি মুছে না, কেবল ফাইলগুলি মোছা হয়।
vikas027

2

উত্তরীয় এখনও প্রয়োগ করার জন্য বিতর্ক করছে state = empty https://github.com/ansible/ansible-modules-core/issues/902

my_folder: "/home/mydata/web/"
empty_path: "/tmp/empty"


- name: "Create empty folder for wiping."
  file:
    path: "{{ empty_path }}" 
    state: directory

- name: "Wipe clean {{ my_folder }} with empty folder hack."
  synchronize:
    mode: push

    #note the backslash here
    src: "{{ empty_path }}/" 

    dest: "{{ nl_code_path }}"
    recursive: yes
    delete: yes
  delegate_to: "{{ inventory_hostname }}"

তবে নোট করুন, সিঙ্ক্রোনাইজের মাধ্যমে আপনার ফাইলগুলি (মুছে ফেলা সহ) যেকোনভাবে সঠিকভাবে সিঙ্ক করতে সক্ষম হওয়া উচিত।


2

এটাই আমি নিয়ে এসেছি:

- name: Get directory listing
  find:
    path: "{{ directory }}" 
    file_type: any
    hidden: yes
  register: directory_content_result

- name: Remove directory content
  file:
    path: "{{ item.path }}" 
    state: absent
  with_items: "{{ directory_content_result.files }}" 
  loop_control:
    label: "{{ item.path }}" 

প্রথমে, আমরা findসেটিং সহ ডিরেক্টরি তালিকা পাচ্ছি

  • file_typeany, তাই আমরা নেস্টেড ডিরেক্টরি এবং লিঙ্কগুলি মিস করব না
  • hiddenyes, তাই আমরা লুকানো ফাইলগুলি এড়িয়ে চলি না
  • এছাড়াও, সেট না recurseকরার জন্য yes, যেহেতু এটি শুধুমাত্র অপ্রয়োজনীয়, কিন্তু সঞ্চালনের সময় বৃদ্ধি হতে পারে।

তারপরে, আমরা fileমডিউল সহ সেই তালিকাটি দিয়ে যাই । এটির আউটপুটটি কিছুটা ভার্বোজ, সুতরাং loop_control.labelসীমাবদ্ধ আউটপুটটি আমাদের সহায়তা করবে (এই পরামর্শটি এখানে পেয়েছেন )।


তবে আমি পূর্ববর্তী সমাধানটি কিছুটা ধীর হতে পেলাম, কারণ এটি সামগ্রীর মাধ্যমে পুনরাবৃত্তি হয়, তাই আমি এগুলি দিয়েছিলাম:

- name: Get directory stats
  stat:
    path: "{{ directory }}"
  register: directory_stat

- name: Delete directory
  file:
    path: "{{ directory }}"
    state: absent

- name: Create directory
  file:
    path: "{{ directory }}"
    state: directory
    owner: "{{ directory_stat.stat.pw_name }}"
    group: "{{ directory_stat.stat.gr_name }}"
    mode: "{{ directory_stat.stat.mode }}"
  • এর সাথে ডিরেক্টরি বৈশিষ্ট্য পান stat
  • ডিরেক্টরি মুছুন
  • একই বৈশিষ্ট্য সহ ডিরেক্টরি পুনরায় তৈরি করুন।

এটি আমার পক্ষে যথেষ্ট ছিল, তবে আপনি চাইলে এটিও যুক্ত attributesকরতে পারেন।


1

একটি সমস্যা খোলা আছে সম্পর্কে শ্রদ্ধার সাথে ।

আপাতত, সমাধানটি আমার পক্ষে কাজ করে: স্থানীয়ভাবে একটি খালি ফোল্ডার তৈরি করুন এবং এটি রিমোটের সাথে সিঙ্ক্রোনাইজ করুন।

এখানে একটি নমুনা প্লেবুক:

- name: "Empty directory"
  hosts: *
  tasks:
    - name: "Create an empty directory (locally)"
      local_action:
        module: file
        state: directory
        path: "/tmp/empty"

    - name: Empty remote directory
      synchronize:
        src: /tmp/empty/
        dest: /home/mydata/web/
        delete: yes
        recursive: yes

1

বয়স, টাইমস্ট্যাম্প, গ্লোব প্যাটার্ন ইত্যাদির মতো একাধিক ফিল্টারের উপর ভিত্তি করে ফাইলগুলি সাফ করার জন্য আমি একটি কাস্টম উত্তরযোগ্য মডিউল লিখেছি

এটি উত্তরসূরী পুরানো সংস্করণগুলির সাথেও সামঞ্জস্যপূর্ণ। এটি এখানে পাওয়া যাবে

এখানে একটি উদাহরণ:

- cleanup_files:
  path_pattern: /tmp/*.log
  state: absent
  excludes:
    - foo*
    - bar*

0

আমি নিশ্চিত করতে চাই যে ফাইন্ড কমান্ডটি কেবল ডিরেক্টরিতে সমস্ত কিছু মুছে ফেলে এবং ডিরেক্টরিটি অক্ষত রেখে দেয় কারণ আমার ক্ষেত্রে ডিরেক্টরিটি একটি ফাইল সিস্টেম m একটি ফাইল সিস্টেম মুছতে চেষ্টা করার সময় সিস্টেমটি একটি ত্রুটি তৈরি করবে তবে এটি কোনও দুর্দান্ত বিকল্প নয়। আইএম শেল বিকল্পটি ব্যবহার করছে কারণ এই প্রশ্নের জন্য আমি এখন পর্যন্ত কেবলমাত্র এটিই খুঁজে পেয়েছি option

আমি কি করেছিলাম:

কিছু ভেরিয়েবল রাখার জন্য হোস্ট ফাইলটি সম্পাদনা করুন:

[all:vars]
COGNOS_HOME=/tmp/cognos
find=/bin/find

এবং একটি প্লেবুক তৈরি করুন:

- hosts: all
  tasks:
  - name: Ansible remove files
    shell: "{{ find }} {{ COGNOS_HOME }} -xdev -mindepth 1 -delete"

এটি COGNOS_HOME ভেরিয়েবল ডিরেক্টরি / ফাইল সিস্টেমের সমস্ত ফাইল এবং ডিরেক্টরি মুছবে। "-মাইন্ডপথ 1" বিকল্পটি নিশ্চিত করে যে বর্তমান ডিরেক্টরিটি স্পর্শ করবে না।


0

যদি আপনি উত্তরযোগ্য> = 2.3 ব্যবহার করেন তবে ফাইল এবং ডায়ারের মধ্যে পার্থক্য আর প্রয়োজন নেই)

- name: Collect all fs items inside dir
  find:
    path: "{{ target_directory_path }}"
    hidden: true
    file_type: any
  changed_when: false
  register: collected_fsitems
- name: Remove all fs items inside dir
  file:
    path: "{{ item.path }}"
    state: absent
  with_items: "{{ collected_fsitems.files }}"
  when: collected_fsitems.matched|int != 0

-1

ধরে নিই যে আপনি সর্বদা লিনাক্সে findরয়েছেন , সেমিডি চেষ্টা করুন ।

- name: Clean everything inside {{ item }}
  shell: test -d {{ item }} && find {{ item }} -path '{{ item }}/*' -prune -exec rm -rf {} \;
  with_items: [/home/mydata/web]

এটিতে ফাইল / ফোল্ডারগুলি / গোপনের নীচে মুছে ফেলা উচিত /home/mydata/web


1
এটি কাজ করতে পারে তবে শেল মডিউলটি ব্যবহার করা সর্বদা একটি শেষ অবলম্বন হওয়া উচিত।
ক্রিস

-1
先 删除 对应 的 目录, 然后 在 创建 该 目录, 使用 的 是 嵌套 循环
  - name: delete old data and clean cache
    file:
      path: "{{ item[0] }}" 
      state: "{{ item[1] }}"
    with_nested:
      - [ "/data/server/{{ app_name }}/webapps/", "/data/server/{{ app_name }}/work/" ]
      - [ "absent", "directory" ]
    ignore_errors: yes

-4

এটি আমার উদাহরণ।

  1. রেপো ইনস্টল করুন
  2. Rsyslog প্যাকেজ ইনস্টল করুন
  3. বন্ধ করুন rsyslog
  4. / var / log / rsyslog / এর ভিতরে থাকা সমস্ত ফাইল মুছুন
  5. আরএসএসলগ শুরু করুন

    - hosts: all
      tasks:
        - name: Install rsyslog-v8 yum repo
          template:
            src: files/rsyslog.repo
            dest: /etc/yum.repos.d/rsyslog.repo
    
        - name: Install rsyslog-v8 package
          yum:
            name: rsyslog
            state: latest
    
        - name: Stop rsyslog
          systemd:
            name: rsyslog
            state: stopped
    
        - name: cleann up /var/spool/rsyslog
          shell: /bin/rm -rf /var/spool/rsyslog/*
    
        - name: Start rsyslog
          systemd:
            name: rsyslog
            state: started
    

-6

নীচে আমার জন্য কাজ করেছে,

- name: Ansible delete html directory
  file:
   path: /var/www/html
   state: directory

এটি কেবল ডিরেক্টরিটি বিদ্যমান তা নিশ্চিত করবে। এটি এটি তৈরি করে যদি এটি না করে তবে রিপোর্ট করা ঠিক আছে ছাড়া অন্য কিছু না করে।
ক্রিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.